2013-08-21 9 views
17

2つの既知の文字列の間の値を取得するSQLクエリが必要です(戻り値はこれらの2つの文字列で開始および終了します)。2つの既知の文字列の間の文字列を選択するSQLクエリ

例。

「私が知っていたのは、犬は非常に悪く、他の誰が思っていたかにかかわらず、すぐに厳しい罰が必要だということでした。

この場合、既知の文字列は「犬」と「すぐ」です。だから私のクエリは、私がこれまでに出てくるが、無駄にしました「犬は非常に悪いされていると、すぐに厳しい罰を必要としていた」

を返す必要があります:

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

含む可変で@Textメインストリング。

誰かが間違っているところで私を助けてくれますか?

+1

あなたはどのようなエラーを取得しているか、何を返していますか? – eatonphil

+0

「犬は非常に悪く、厳しい罰がすぐに守られなければならない」 –

答えて

31

問題は、あなたのサブストリング引数の2番目の部分は最初のインデックスを含めていることです。 この作業を行うには、2番目のインデックスから最初のインデックスを引く必要があります。あなたが「すぐに罰」の開始位置を取得するが、あなたのサブストリングのための長さのパラメータとしてこれを中に渡している

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

あなたが探しているブックエンドがそれぞれ一度しか表示されていないが、複数回表示されていない場合に機能する。 – samthebrand

5

SUBSTRINGのLENGTHを調整する必要があります。あなたはそれを「終わりの文字列」の終わりに向けていました。

はこのような何か試してみてください。もちろん

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

私は何エヴァンが意味することは、このだったと思います。

「犬」の開始位置を「罰」のcharindexから差し引き、「罰」の長さを3番目のパラメータに追加する必要があります。これにより正しいテキストが得られます。ここで

は、プロセスを説明するためのいくつかの大まかな、ハックコードです:

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

OPが尋ねたこととまったく同じではありません。この回答は文字列の縞を取り除きます。しかし、これは便利なスニペットです。 – samthebrand

1

SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text) 
, CHARINDEX('immediately',@text) - CHARINDEX('the dog', @Text) + Len('immediately')) 
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 $ ''のようなものがあり、それに 'bbbbb&ccc'を含む2行を返そうとするとどうなりますか? –

+1

1行目では、選択したiはOKです。 2番目の場合 (aaaaa $ bbbbb $ cc $ ccc): リバース(左(反転) 'aaaaa $ bbbbb $ cc $ ccc')、charindex( '$'、reverse( 'aaaaa $ bbbbb $ cc $ ccc ')))-1)) –

+0

これは実際にはOPs文字列の "ブックエンド"が同じ文字であると仮定しているので、実際には問題ではありません。 – 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

このコードスニペットは歓迎されていますが、いくつかの助けを与えるかもしれませんが、* how *と* Why *がこれを解決する(説明があれば大幅に改善されます)(// meta.stackexchange.com/q/114762)問題。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

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 
上記の質問については0

は、使用法は次のとおりです。

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 ' 
関連する問題