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))
Конечно, вам может понадобиться немного отрегулировать его.
Ответ 5
SELECT
SUBSTRING( '[email protected]', charindex('@','[email protected]',1) + 1, charindex('.','[email protected]',1) - charindex('@','[email protected]',1) - 1 )
Ответ 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¶meter=1&listing=No
необходимости в этом формате.
Я закончил тем, что создал пользовательскую функцию для выполнения строки между следующими предположениями:
- Если начальное вхождение не найдено, возвращается
NULL
, и - Если конечное вхождение не найдено, возвращается остальная часть строки
Вот код:
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