11

特定のパターンの文字列があります:

23;chair,red [$3]

つまり、数字の後にセミコロンが続き、名前の後に左角かっこが続きます。

セミコロン;が常に存在し、左角かっこが常に文字列に存在すると仮定すると、SQL Serverクエリのとの[間のテキストを抽出するにはどうすればよいですか?ありがとう。;[

4

5 に答える 5

24

SUBSTRING()、、、LEFT()およびCHARINDEX()関数を組み合わせます。

SELECT LEFT(SUBSTRING(YOUR_FIELD,
                      CHARINDEX(';', YOUR_FIELD) + 1, 100),
                      CHARINDEX('[', YOUR_FIELD) - 1)
FROM YOUR_TABLE;

これは、フィールド長が100を超えることはないことを前提としていますが、関数を使用することで、必要に応じてそれをより賢く説明できLEN()ます。すでに十分なことが行われているので気にしませんでしたし、テストするインスタンスがないので、かっこなどを目で確認しています。

于 2012-04-22T06:59:23.133 に答える
5

それらが常に存在し、データの一部ではないと仮定すると、これは機能します。

declare @string varchar(8000) = '23;chair,red [$3]'
select substring(@string, charindex(';', @string) + 1, charindex(' [', @string) - charindex(';', @string) - 1)
于 2012-04-22T07:04:47.117 に答える
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を最後に実行すると、改訂されたサブ文字列ではなく、元の文字列の最後の区切り文字の位置が機能します。

于 2013-09-12T02:08:59.537 に答える
1

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を使用します。お役に立てれば!

于 2017-08-06T04:18:39.060 に答える
0

メールアドレスなど、何かを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

お役に立てれば。

于 2015-10-28T23:16:54.117 に答える