特定のパターンの文字列があります:
23;chair,red [$3]
つまり、数字の後にセミコロンが続き、名前の後に左角かっこが続きます。
セミコロン;
が常に存在し、左角かっこが常に文字列に存在すると仮定すると、SQL Serverクエリのとの[
間のテキストを抽出するにはどうすればよいですか?ありがとう。;
[
特定のパターンの文字列があります:
23;chair,red [$3]
つまり、数字の後にセミコロンが続き、名前の後に左角かっこが続きます。
セミコロン;
が常に存在し、左角かっこが常に文字列に存在すると仮定すると、SQL Serverクエリのとの[
間のテキストを抽出するにはどうすればよいですか?ありがとう。;
[
SUBSTRING()
、、、LEFT()
およびCHARINDEX()
関数を組み合わせます。
SELECT LEFT(SUBSTRING(YOUR_FIELD,
CHARINDEX(';', YOUR_FIELD) + 1, 100),
CHARINDEX('[', YOUR_FIELD) - 1)
FROM YOUR_TABLE;
これは、フィールド長が100を超えることはないことを前提としていますが、関数を使用することで、必要に応じてそれをより賢く説明できLEN()
ます。すでに十分なことが行われているので気にしませんでしたし、テストするインスタンスがないので、かっこなどを目で確認しています。
それらが常に存在し、データの一部ではないと仮定すると、これは機能します。
declare @string varchar(8000) = '23;chair,red [$3]'
select substring(@string, charindex(';', @string) + 1, charindex(' [', @string) - charindex(';', @string) - 1)
@Marcによって提供された答えの代替
SELECT SUBSTRING(LEFT(YOUR_FIELD, CHARINDEX('[', YOUR_FIELD) - 1), CHARINDEX(';', YOUR_FIELD) + 1, 100)
FROM YOUR_TABLE
WHERE CHARINDEX('[', YOUR_FIELD) > 0 AND
CHARINDEX(';', YOUR_FIELD) > 0;
これにより、区切り文字が確実に存在し、現在受け入れられている回答の問題が解決されます。LEFTを最後に実行すると、改訂されたサブ文字列ではなく、元の文字列の最後の区切り文字の位置が機能します。
your_tableからsubstring(your_field、CHARINDEX(';'、your_field)+1、CHARINDEX('['、your_field)-CHARINDEX(';'、your_field)-1)を選択します
他の人を働かせることができません。';'の間にあるものが欲しいだけだと思います。および'['は、間にある文字列の長さに関係なく、すべての場合に使用されます。サブストリング関数でフィールドを指定した後、2番目の引数は抽出するものの開始位置です。つまり、「;」';'を含めたくないので、は+ 1(4番目の位置-c)です。次の引数は、「[」(位置14)の位置を取り、「;」の後のスポットの位置を減算します。(4番目の位置-これが、クエリで1を引く理由です)。これは基本的にsubstring(フィールド、サブストリングを開始する場所、サブストリングの長さ)を示します。他の場合にも同じ関数を使用しました。一部のフィールドに「;」がない場合 あなたも' 「where」句でそれらを除外したいのですが、それは質問とは少し異なります。もしあなたの ';' と言った...';;;'、例では1ではなく3を使用します。お役に立てれば!
メールアドレスなど、何かを3つに分割する必要があり、中央部分の長さがわからない場合は、これを試してください(これは、SQLServer 2012で実行しただけなので、機能することがわかっています)。
SELECT top 2000
emailaddr_ as email,
SUBSTRING(emailaddr_, 1,CHARINDEX('@',emailaddr_) -1) as username,
SUBSTRING(emailaddr_, CHARINDEX('@',emailaddr_)+1, (LEN(emailaddr_) - charindex('@',emailaddr_) - charindex('.',reverse(emailaddr_)) )) domain
FROM
emailTable
WHERE
charindex('@',emailaddr_)>0
AND
charindex('.',emailaddr_)>0;
GO
お役に立てれば。