sql >> データベース >  >> RDS >> Sqlserver

SQL ServerのCHARINDEX()とPATINDEX()–違いは何ですか?

    SQL Serverでは、CHARINDEX()のいずれかを使用できます。 関数またはPATINDEX() 文字列内の文字列を検索する関数。これらはTransact-SQL文字列関数であり、Azureデータベースでも利用できます。

    一見すると、これらの関数はまったく同じことをしているように見えます。多くの場合、どちらを使用してもかまいません。

    ただし、特定のシナリオで使用することを決定する機能を決定する可能性のあるいくつかの違いがあります。これらは次のように要約できます:

    • PATINDEX() ワイルドカード文字を使用してパターンを検索できます。 CHARINDEX() しません。
    • CHARINDEX() 検索の開始位置を指定できる3番目の引数を受け入れます。 PATINDEX() しません。

    これらのポイントの詳細については、以下をご覧ください。

    定義

    まず、公式の定義または各関数を見てみましょう。

    CHARINDEX()
    2番目の文字式内の1つの文字式を検索し、見つかった場合は最初の式の開始位置を返します。
    PATINDEX()
    すべての有効なテキストおよび文字データ型で、指定された式でパターンが最初に出現する開始位置を返します。パターンが見つからない場合はゼロを返します。

    構文

    そして、これが各関数の公式構文です。

    CHARINDEX()

    CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

    PATINDEX()

    PATINDEX ( '%pattern%' , expression )

    したがって、どちらの関数でも文字式を検索できますが、PATINDEX() 関数を使用すると、パターンを検索できます 。つまり、これはCHARINDEX()では得られない追加機能です。 働き。 PATINDEX()を使用 ワイルドカード文字を使用して、検索するパターンを指定できます。これは、状況によっては非常に便利です。

    ただし、CHARINDEX() PATINDEX()に対して、3つの引数を受け入れます 2つだけ受け入れます。 CHARINDEX() 関数は、検索の開始位置を指定できるオプションの3番目の引数を受け入れます。つまり、CHARINDEX() 関数を使用すると、文字列内の特定のポイントの後に発生する一致のみを返すことができます。

    各機能によって提供される追加機能を示す例を次に示します。

    CHARINDEX()

    ここでは、検索を開始する位置を指定するための3番目の引数を提供します。この場合、Bobの最初の出現をスキップします 2番目のオカレンスの位置を返します。

    SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
    

    結果:

    17
    

    したがって、前述のように、PATINDEX()ではこれを行うことはできません。 その3番目のパラメータを受け入れないためです。

    PATINDEX()

    PATINDEX()でできることの例を次に示します。 CHARINDEX()ではできないこと 。この例では、ワイルドカード文字を使用してパターンを検索します。

    SELECT PATINDEX('%b_er%', 'Bob likes beer.');

    結果:

    11

    この場合、パーセント記号(%)を使用します )これは、任意の数の文字が検索文字列に進んで成功する可能性があることを示すワイルドカードです。アンダースコア(_)も使用します )これはシングルのワイルドカードです キャラクター。

    結論

    したがって、両方のCHARINDEX() およびPATINDEX() 同様の機能を提供します。多くの場合、どちらか一方を他方の代わりに使用できます。場合によっては、一方を他方の上に使用する必要があります。

    具体的には、CHARINDEX()を使用します 検索する文字列内の開始位置を指定する場合。そして、PATINDEX()を使用します 検索するパターンを指定する必要があるときはいつでも。


    1. Spring、Hibernate、Blobの遅延読み込み

    2. PostgreSQL:psqlコマンドラインユーティリティを使用する場合のWindowsでのエンコーディングの問題

    3. sqlite:合計時間を追加する方法hh:mm:ssここで、列のデータ型はDATETIMEですか?

    4. MariaDB SESSION_USER()の説明