web-dev-qa-db-ja.com

2つの既知の文字列から文字列を選択するSQLクエリ

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

例。

「私が知っていたのは、犬が非常にひどく、他の誰かが何を考えていたとしてもすぐに厳しい罰を要求したことだけでした。」

この場合、既知の文字列は「the dog」と「immediately」です。したがって、私のクエリは「犬は非常にひどく、すぐに厳しい罰を要求していました」を返すはずです

私はこれまでのところこれを思いついたが、役に立たなかった:

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

@Textは、メイン文字列を含む変数です。

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

28
coopertkm

問題は、サブストリング引数の2番目の部分に最初のインデックスが含まれていることです。これを機能させるには、2番目のインデックスから最初のインデックスを引く必要があります。

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

エヴァンの意図はこれだと思う:

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

例は次のとおりです。文字列と文字$があります

文字列

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
10
Mark Roll

SUBSTRINGの長さを調整する必要があります。 「終了文字列」の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))

もちろん、少し調整する必要があるかもしれません。

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

これを試して、「[」と「]」を文字列に置き換えてください

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

SQL ServerのPATINDEX()関数が必要かもしれないと感じています。これをチェックしてください:

Patindex()関数の使用法

かもね:

SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT))
3
eatonphil
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))
2
Evan M

「すぐに罰」の開始位置を取得していますが、それをサブストリングの長さパラメーターとして渡します。

「すぐに罰する」の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)

結果:犬は非常に悪く、すぐに過酷な処罰が必要でした

1
Mentatmatt
<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
Sunil Kasana

これが役立つことを願っています:変更を行う必要がある場合に、変数を宣言しました。

@line varchar(100)を宣言します

@line ='[email protected] 'を設定します

選択SUBSTRING(@line、(charindex( '-'、@ line)+1)、CHARINDEX( '@'、@ line)-charindex( '-'、@ line)-1)

0
Priyaqua
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
0
user11016742