2013-08-21 142 views
17

我需要一個SQL查詢來獲取兩個已知字符串之間的值(返回的值應該以這兩個字符串開始和結束)。一個SQL查詢選擇兩個已知字符串之間的字符串

一個例子。 「我所知道的只是那條狗非常糟糕,不管別人怎麼想,都立即要求苛刻的懲罰。」

在這種情況下,已知的字符串是「狗」和「立即」。所以我的查詢應該返回「狗一直很糟糕,需要立即嚴厲的懲罰」

我來到了這個迄今爲止但無濟於事:

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

@Text是包含變量主要字符串。

有人可以幫我我哪裏出錯了嗎?

+1

你得到什麼錯誤,或者是什麼回來? – eatonphil

+0

「狗已經非常糟糕,需要立即勒索苛刻的懲罰」 –

回答

31

的問題是,你的子論證的第二部分包括第一指標。 您需要從第二個索引中減去第一個索引才能完成此項工作。

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

如果你正在尋找的書擋只出現一次,但如果它們多次出現則不適用。 – samthebrand

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

當然,你可能需要調整它一下。

2

我有一種感覺,你可能需要SQL Server的PATINDEX()函數。檢查了這一點:

Usage on Patindex() function

所以也許:

SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT)) 
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)) 
4

我認爲埃文的意思是這樣的:

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

不完全是OP所要求的:這個答案剝去邊緣上的字符串。但這是一個有用的片段。 – samthebrand

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) 

結果:狗一直很糟糕,需要嚴厲的處罰立即

2

試試這個,替換「[」 '&']'與您的字符串

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

Exa mple是這樣的:你有一個字符串和字符$

字符串

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 
+0

如果你有''aaaaa $ bbbbb $ cc $ ccc $''這樣的東西,你想讓它返回2行包含'bbbbb&ccc'? –

+1

對於第一排我提供的選擇是可以的。對於第二個 (aaaaa $ bbbbb $ cc $ ccc): select reverse(left(reverse('aaaaa $ bbbbb $ cc $ ccc'),charindex('$',reverse('aaaaa $ bbbbb $ cc $ ccc'))-1)) –

+0

這並沒有真正回答這個問題,因爲它假設OPs字符串的「bookends」是相同的字符,這是不正確的。 – samthebrand

0

希望這會有所幫助: 聲明一個變量,如果有任何更改只需要做一次即可。

申報@line VARCHAR(100)

組@line ='[email protected]

選擇SUBSTRING(@line,(CHARINDEX( ' - ',@線)+1 ),CHARINDEX( '@',@線)-charindex( ' - ',@線)-1)

+0

您可以添加更多關於您的查詢正在做什麼的解釋,這將使您的答案更有幫助。歡迎來到StackOverflow。 –

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

+1

雖然這段代碼片段是受歡迎的,並且可能會提供一些幫助,但它會[如果它包含一個解釋](/ meta.stackexchange.com/q/114762)* how *和* why *會大大改進,這將解決問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

0

我有類似的需要解析出一組參數存儲在一個IIS日誌'csUriQuery字段,看起來像這樣:id=3598308&user=AD\user&parameter=1&listing=Nothis 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 ' 
相關問題