我需要一个SQL查询来获取两个已知字符串(返回值应该开始与这两个字符串结束)之间的值。
一个例子。
“我所知道的是,狗一直很糟糕,需要严厉的处罚立即不管别人怎么想的。”
在这种情况下,已知的字符串是“狗”和“立即”。所以我的查询应该返回“狗一直很糟糕,需要立即严厉的惩罚”
我想出了这个迄今为止但无济于事:
SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text), CHARINDEX('immediately', @Text))
@Text是含有主串的变量。
是否有人可以帮助我,我要去错在何处?
问题是,你的子论证的第二部分包括第一指标。你需要从你的第二个指数减去第一指标,使这项工作。
SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text)
, CHARINDEX('immediately',@text) - CHARINDEX('the dog', @Text) + Len('immediately'))
你“立即惩罚”获得的首发位置,但经过在为你的子字符串长度参数。
您将需要从“立即惩罚”的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)
结果:狗一直很糟糕,需要立即严厉的惩罚
<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
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
希望这有助于:声明的变量,在情况需要做出这就是只有一次的任何变化。
声明@line VARCHAR(100)
设置@line ='[email protected]”
选择SUBSTRING(@line,(CHARINDEX( ' - ',@线)+1),CHARINDEX( '@',@线)-charindex( ' - ',@线)-1)
我认为埃文的意思是这样的:
SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text) + LEN(@First),
CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) - LEN(@First))
一个例子是这样的:你有一个字符串和字符$
字符串:
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
您需要调整的子串的长度。你它是指向“结尾的字符串”的结束。
尝试是这样的:
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))
当然,你可能需要调整它一下。
试试这个,取代“[”和“]”你的字符串
SELECT SUBSTRING(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)
SELECT
SUBSTRING( '[email protected]', charindex('@','[email protected]',1) + 1, charindex('.','[email protected]',1) - charindex('@','[email protected]',1) - 1 )
我有一种感觉,你可能需要的SQL Server PATINDEX()函数。看一下这个:
因此,也许:
SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT))
我也有类似的需要分析出一组存储的IIS日志csUriQuery领域内的参数,它是这样的:在id=3598308&user=AD\user¶meter=1&listing=No
需要this format。
我结束了创建一个用户自定义函数来完成之间的字符串,以下假设:
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 '
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))