SQL Serverでは、T-SQLのCHARINDEX()
を使用できます。 関数またはPATINDEX()
別の文字列内の文字列を検索する関数。各機能の概要は次のとおりです。
CHARINDEX()関数
この関数は3つの引数を受け入れます。検索する文字列、検索する文字列、およびオプションの開始位置。
CHARINDEX()
構文は次のようになります:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
expressionToFindの場所 は他の文字列で検索する式であり、 expressionToSearch もう1つの文字列です。オプションのstart_location expressionToSearch内の位置を指定するために使用できます 検索を開始する対象。
最初に出現した位置のみが返されることに注意してください。
例
次に例を示します:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
結果:
1
この例では、最初の引数はBob
です。 、これは、2番目の引数でBob
を検索していることを意味します 。 Bob
の位置であるため、結果は1になります。 最初は2番目の引数に表示されます。
Bob
にも気付くかもしれません 実際には文字列に2回表示されますが、最初に一致した位置のみが返されます。
一致なし
2番目の引数にBob
が含まれていなかった場合 結果は0
になります 。
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
結果:
0
開始位置の指定
検索を開始する場所の開始位置を指定できます。これは、SQLServerがその開始位置の前にあるすべてのオカレンスをスキップすることを意味します。ただし、結果は文字列内の位置に基づいて報告されます(開始位置からではありません)。
これが紛らわしいと思われる場合は、次の例が役立ちます。
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
結果:
17
したがって、この例では、位置16(2番目のBob
の前のスペース)から検索を開始します。 )。その結果、Bob
が最初に出現します。 はスキップされ、2番目の位置が返されます。また、その位置は文字列の先頭から17文字であることがわかります(検索を開始した場所から1文字だけですが)。
大文字と小文字の区別
SELECTステートメントにCOLLATE句を追加することにより、大文字と小文字を区別する検索を明示的に実行できます。
大文字と小文字を区別する
大文字と小文字を区別する検索は次のとおりです:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
結果:
0
_CS
であるため、これは大文字と小文字が区別されます 大文字と小文字を区別するの略です。
大文字と小文字を区別しない
大文字と小文字を区別しない検索は次のとおりです:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
結果:
11
_CI
であるため、これは大文字と小文字を区別しません。 大文字と小文字を区別しないことを表します。
PATINDEX()関数
PATINDEX()
関数はCHARINDEX()
と同様の仕事をします 。基本的に、どちらを使用するかを選択できます。主な違いは構文にあります。
PATINDEX()
関数の構文は次のようになります:
PATINDEX ( '%pattern%' , expression )
ここでpattern は、検出されるシーケンスを含む文字式であり、 expression 検索する式(通常は列)です。
PATINDEX()
ワイルドカード文字を受け入れますが、開始位置は受け入れません。 CHARINDEX()
一方、開始位置は受け入れますが、ワイルドカード文字は受け入れません。
例
次に例を示します:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
結果:
12
ただし、ワイルドカード文字を含めない場合は次のようになります。
SELECT PATINDEX('eer', 'Bob likes beer.');
結果:
0
別のワイルドカード文字を紹介する別の例を次に示します。
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
結果:
11
この場合、アンダースコア(_
)これは、任意の1文字のワイルドカードです。