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?
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'))
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))
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
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.
SELECT
SUBSTRING( '[email protected]', charindex('@','[email protected]',1) + 1, charindex('.','[email protected]',1) - charindex('@','[email protected]',1) - 1 )
Essayez ceci et remplacez '[' & ']' par votre chaîne
SELECT SUBSTRING(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)
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))
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¶meter=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:
NULL
est renvoyée et 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 '
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))
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
<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
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)
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