用于在两个已知字符串之间选择字符串的SQL查询

coo*_*tkm 29 sql sql-server substring

我需要一个SQL查询来获取两个已知字符串之间的值(返回的值应该以这两个字符串开头和结尾).

一个例子.

"我所知道的是,这条狗非常糟糕,无论其他人怎么想,都要立即受到严厉的惩罚."

在这种情况下,已知的字符串是"狗"和"立即".所以我的询问应该回归"狗一直非常糟糕,需要立刻进行严厉的惩罚"

到目前为止,我已经想出了这个,但无济于事:

SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text), CHARINDEX('immediately', @Text))
Run Code Online (Sandbox Code Playgroud)

@Text是包含主字符串的变量.

有人可以帮我解决我出错的地方吗?

org*_*ger 49

问题是你的substring参数的第二部分包括第一个索引.您需要从第二个索引中减去第一个索引才能使其工作.

SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text)
, CHARINDEX('immediately',@text) - CHARINDEX('the dog', @Text) + Len('immediately'))
Run Code Online (Sandbox Code Playgroud)

  • 如果您要查找的书挡仅出现一次,则会有效,但如果它们出现不止一次则无效. (6认同)

Mar*_*oll 11

一个例子是:你有一个字符串和字符$

字符串:

aaaaa$bbbbb$ccccc
Run Code Online (Sandbox Code Playgroud)

代码:

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
Run Code Online (Sandbox Code Playgroud)

输出:

bbbbb
Run Code Online (Sandbox Code Playgroud)

  • 对于第一行,我提供的选择是可以的。对于第二个(aaaaa$bbbbb$cc$ccc):选择反向(左(反向('aaaaa$bbbbb$cc$ccc'),charindex('$',reverse('aaaaa$bbbbb$cc$ccc') ) -1)) (2认同)

Dat*_*eur 10

我想Evan的意思是:

SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text) + LEN(@First), 
                 CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) - LEN(@First))
Run Code Online (Sandbox Code Playgroud)

  • 并非OP的要求完全正确:此答案会剥离边缘的字符串。但这是一个有用的代码段。 (2认同)

vGH*_*ard 8

我也有类似的需求来解析存储在 IIS 日志的 csUriQuery 字段中的一组参数,它看起来像这样:id=3598308&user=AD\user&parameter=1&listing=No需要这种格式

我最终创建了一个用户定义的函数来完成一个字符串,并有以下假设:

  1. 如果未找到起始事件,NULL则返回 a,并且
  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
Run Code Online (Sandbox Code Playgroud)

对于上面的问题,用法如下:

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 '
Run Code Online (Sandbox Code Playgroud)


BWS*_*BWS 5

您需要在SUBSTRING中调整LENGTH.你把它指向'结束字符串'的END.

尝试这样的事情:

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))
Run Code Online (Sandbox Code Playgroud)

当然,您可能需要稍微调整一下.


eat*_*hil 5

我有一种感觉,您可能需要 SQL Server 的 PATINDEX() 函数。看一下这个:

Patindex() 函数的用法

所以也许:

SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT))
Run Code Online (Sandbox Code Playgroud)


小智 5

试试这个,用你的字符串替换'['&']'

SELECT SUBSTRING(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)
Run Code Online (Sandbox Code Playgroud)


小智 5

SELECT 
SUBSTRING( '123@yahoo.com',  charindex('@','123@yahoo.com',1) + 1, charindex('.','123@yahoo.com',1) - charindex('@','123@yahoo.com',1) - 1 )
Run Code Online (Sandbox Code Playgroud)