一个SQL查询来选择两个已知串之间的串

问题描述 投票:26回答:13

我需要一个SQL查询来获取两个已知字符串(返回值应该开始与这两个字符串结束)之间的值。

一个例子。

“我所知道的是,狗一直很糟糕,需要严厉的处罚立即不管别人怎么想的。”

在这种情况下,已知的字符串是“狗”和“立即”。所以我的查询应该返回“狗一直很糟糕,需要立即严厉的惩罚”

我想出了这个迄今为止但无济于事:

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

@Text是含有主串的变量。

是否有人可以帮助我,我要去错在何处?

sql sql-server substring
13个回答
47
投票

问题是,你的子论证的第二部分包括第一指标。你需要从你的第二个指数减去第一指标,使这项工作。

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

1
投票

你“立即惩罚”获得的首发位置,但经过在为你的子字符串长度参数。

您将需要从“立即惩罚”的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)

结果:狗一直很糟糕,需要立即严厉的惩罚


0
投票
<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  


0
投票
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

-1
投票

希望这有助于:声明的变量,在情况需要做出这就是只有一次的任何变化。

声明@line VARCHAR(100)

设置@line ='[email protected]

选择SUBSTRING(@line,(CHARINDEX( ' - ',@线)+1),CHARINDEX( '@',@线)-charindex( ' - ',@线)-1)


10
投票

我认为埃文的意思是这样的:

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

10
投票

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

字符串:

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

5
投票

您需要调整的子串的长度。你它是指向“结尾的字符串”的结束。

尝试是这样的:

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(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)

5
投票
SELECT 
SUBSTRING( '[email protected]',  charindex('@','[email protected]',1) + 1, charindex('.','[email protected]',1) - charindex('@','[email protected]',1) - 1 )

3
投票

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

Usage on Patindex() function

因此,也许:

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

3
投票

我也有类似的需要分析出一组存储的IIS日志csUriQuery领域内的参数,它是这样的:在id=3598308&user=AD\user&parameter=1&listing=No需要this format

我结束了创建一个用户自定义函数来完成之间的字符串,以下假设:

  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 '

2
投票
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))
© www.soinside.com 2019 - 2024. All rights reserved.