SQL Query для выбора строки между двумя известными строками

Мне нужен SQL-запрос для получения значения между двумя известными строками (возвращаемое значение должно начинаться и заканчиваться этими двумя строками).

Пример.

"Все, что я знал, было то, что собака была очень плоха и требовала жесткого наказания, независимо от того, что кто-то еще подумал".

В этом случае известными строками являются "собака" и "сразу". Поэтому мой запрос должен вернуться "собака была очень плохой и требовала жесткого наказания немедленно"

Я придумал это до сих пор, но безрезультатно:

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

@Text - это переменная, содержащая основную строку.

Может кто-нибудь, пожалуйста, помогите мне с тем, где я ошибаюсь?

Ответы

Ответ 1

Проблема в том, что вторая часть вашего аргумента подстроки включает первый индекс. Вы должны вычесть первый индекс из вашего второго индекса, чтобы сделать эту работу.

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

Ответ 2

Я думаю, что Эван имел в виду следующее:

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

Ответ 3

Примером является следующее: у вас есть строка и символ $

Строка:

aaaaa$bbbbb$ccccc

Код:

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

Выход:

bbbbb

Ответ 4

Вам нужно настроить LENGTH в SUBSTRING. Вы указывали его на конец конечной строки.

Попробуйте что-то вроде этого:

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))

Конечно, вам может понадобиться немного отрегулировать его.

Ответ 6

У меня такое чувство, что вам может понадобиться функция SQL Server PATINDEX(). Проверьте это:

Использование функции Patindex()

Итак, возможно:

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

Ответ 7

Попробуйте это и замените '[' и '] вашей строкой

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

Ответ 8

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))

Ответ 9

У меня была похожая необходимость проанализировать набор параметров, хранящихся в поле csUriQuery журналов IIS, которое выглядело так: id=3598308&user=AD\user&parameter=1&listing=No необходимости в этом формате.

Я закончил тем, что создал пользовательскую функцию для выполнения строки между следующими предположениями:

  1. Если начальное вхождение не найдено, возвращается NULL, и
  2. Если конечное вхождение не найдено, возвращается остальная часть строки

Вот код:

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

Для вышеприведенного вопроса используется следующее:

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 '

Ответ 10

Вы получаете начальную позицию "наказание немедленно", но передаете это как параметр длины для вашей подстроки.

Вам нужно будет вычесть исходную позицию "собаки" из charindex "немедленного наказания", а затем добавить длину строки "наказание немедленно" к вашему третьему параметру. Это даст вам правильный текст.

Вот пример грубого, взломанного кода для иллюстрации процесса:

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)

Результат: собака была очень плоха и требовала жесткого наказания немедленно

Ответ 11

Надеюсь, что это поможет: Объявленная переменная, в случае каких-либо изменений, должна быть сделана только один раз.

объявить @line varchar (100)

set @line ='[email protected] '

выберите SUBSTRING (@line, (charindex ('-', @line) +1), CHARINDEX ('@', @line) -charindex ('-', @line) -1)

Ответ 12

<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  

Ответ 13

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