web-dev-qa-db-fra.com

Une requête SQL pour sélectionner une chaîne entre deux chaînes connues

J'ai besoin d'une requête SQL pour obtenir la valeur entre deux chaînes connues (la valeur renvoyée doit commencer et se terminer par ces deux chaînes).

Un exemple.

"Tout ce que je savais, c'est que le chien avait été très mauvais et qu'il avait immédiatement besoin d'une punition sévère, peu importe ce que les autres pensaient."

Dans ce cas, les chaînes connues sont "le chien" et "immédiatement". Donc, ma requête devrait revenir "le chien avait été très mauvais et avait besoin d'une punition sévère immédiatement"

Je suis venu avec cela jusqu'à présent, mais en vain:

SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text), CHARINDEX('immediately', @Text))

@Text étant la variable contenant la chaîne principale.

Quelqu'un peut-il m'aider s'il vous plaît avec où je vais mal?

22
coopertkm

Le problème est que la deuxième partie de l'argument de votre sous-chaîne inclut le premier index . Vous devez soustraire le premier index de votre second index pour que cela fonctionne.

SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text)
, CHARINDEX('immediately',@text) - CHARINDEX('the dog', @Text) + Len('immediately'))
40
orgtigger

Je pense que ce que Evan voulait dire était ceci: 

SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text) + LEN(@First), 
                 CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) - LEN(@First))
7
Data Masseur

Voici un exemple: vous avez une chaîne et le caractère $

Chaîne

aaaaa$bbbbb$ccccc

Code

SELECT SUBSTRING('aaaaa$bbbbb$ccccc',CHARINDEX('$','aaaaa$bbbbb$ccccc')+1, CHARINDEX('$','aaaaa$bbbbb$ccccc',CHARINDEX('$','aaaaa$bbbbb$ccccc')+1) -CHARINDEX('$','aaaaa$bbbbb$ccccc')-1) as My_String

Sortie

bbbbb
7
Mark Roll

Vous devez ajuster la LONGUEUR dans le SUBSTRING. Vous le dirigiez vers la fin de la "chaîne de fin".

Essayez quelque chose comme ça:

declare @TEXT varchar(200)
declare @ST varchar(200)
declare @EN varchar(200)
set @ST = 'the dog'
set @EN = 'immediately'
set @TEXT = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SELECT SUBSTRING(@Text, CHARINDEX(@ST, @Text), (CHARINDEX(@EN, @Text)+LEN(@EN))-CHARINDEX(@ST, @Text))

Bien sûr, vous devrez peut-être ajuster un peu.

5
BWS
SELECT 
SUBSTRING( '[email protected]',  charindex('@','[email protected]',1) + 1, charindex('.','[email protected]',1) - charindex('@','[email protected]',1) - 1 )
5

Essayez ceci et remplacez '[' & ']' par votre chaîne

SELECT SUBSTRING(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)
4
agrawars

J'ai l'impression que vous pourriez avoir besoin de la fonction PATINDEX () de SQL Server. Regarde ça:

Utilisation de la fonction Patindex ()

Alors peut-être:

SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT))
3
eatonphil

J'ai eu le même besoin d'analyser un ensemble de paramètres stockés dans un champ csUriQuery de IIS logs, qui ressemblait à ceci: id=3598308&user=AD\user&parameter=1&listing=No nécessaire dans ce format .

J'ai fini par créer une fonction définie par l'utilisateur pour accomplir une chaîne entre, avec les hypothèses suivantes:

  1. Si l'occurrence de départ n'est pas trouvée, une NULL est renvoyée et 
  2. Si l'occurrence de fin n'est pas trouvée, le reste de la chaîne est renvoyé.

Voici le code:

CREATE FUNCTION dbo.str_between(@col varchar(max), @start varchar(50), @end varchar(50))  
  RETURNS varchar(max)  
  WITH EXECUTE AS CALLER  
AS  
BEGIN  
  RETURN substring(@col, charindex(@start, @col) + len(@start), 
         isnull(nullif(charindex(@end, stuff(@col, 1, charindex(@start, @col)-1, '')),0),
         len(stuff(@col, 1, charindex(@start, @col)-1, ''))+1) - len(@start)-1);
END;  
GO

Pour la question ci-dessus, l'utilisation est la suivante:

DECLARE @a VARCHAR(MAX) = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SELECT dbo.str_between(@a, 'the dog', 'immediately')
-- Yields' had been very bad and required harsh punishment '
2
vGHazard
DECLARE @Text VARCHAR(MAX), @First VARCHAR(MAX), @Second VARCHAR(MAX)
SET @Text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SET @First = 'the dog'
SET @Second = 'immediately'

SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text), 
                 CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) + LEN(@Second))
2
Evan M

Vous obtenez la position de départ de 'punishment immédiatement', mais en le définissant comme paramètre de longueur pour votre sous-chaîne.

Vous devez soustraire la position de départ de "le chien" du caractère de "punition immédiatement", puis ajouter la longueur de la chaîne "punition immédiatement" à votre troisième paramètre. Cela vous donnerait alors le texte correct.

Voici un code approximatif et hacky pour illustrer le processus:

DECLARE @text VARCHAR(MAX)
SET @text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'

DECLARE @start INT
SELECT @start = CHARINDEX('the dog',@text)

DECLARE @endLen INT
SELECT @endLen = LEN('immediately')

DECLARE @end INT
SELECT @end = CHARINDEX('immediately',@text)
SET @end = @end - @start + @endLen

SELECT @end

SELECT SUBSTRING(@text,@start,@end)

Résultat:le chien avait été très mauvais et a immédiatement exigé une punition sévère

1
Mentatmatt
<pre>

DECLARE @text VARCHAR (MAX)

SET @text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'

declare @pretext as nvarchar(100) = 'the dog'    
declare @posttext as nvarchar(100) = 'immediately'

SELECT 
 CASE 
When CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text) + len(@pretext)) < 0 THEN 
''
Else
SUBSTRING(@Text, CHARINDEX(@pretext, @Text) + len(@pretext)
,   CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text) + len(@pretext)) )    
END as betweentext  

0
Sunil Kasana

J'espère que cela vous aidera: Déclaré une variable, en cas de changement nécessaire, une seule fois. 

déclarer @line varchar (100)

set @line ='[email protected] '

sélectionnez SUBSTRING (@line, (charindex ('-', @ line) +1), CHARINDEX ('@', @ line) -charindex ('-', @ line) -1)

0
Priyaqua
SELECT SUBSTRING('aaaaa$bbbbb$ccccc',instr('aaaaa$bbbbb$ccccc','$',1,1)+1, instr('aaaaa$bbbbb$ccccc','$',1,2)-1) -instr('aaaaa$bbbbb$ccccc','$',1,1)) as My_String
0
user11016742