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

SQL Server(T-SQL)でのPATINDEX()関数のしくみ

    SQL Serverでは、T-SQL PATINDEX()を使用できます 文字列内のパターンを検索する関数。具体的には、関数は最初ののみを返します 文字列内のパターンの出現。

    この関数は2つの引数を受け入れます。パターン、および文字列。

    パターン内でワイルドカード文字を使用できます。

    構文

    構文は次のようになります:

    PATINDEX ( '%pattern%' , expression )

    ここでpattern は、検出されるシーケンスを含む文字式であり、 expression 検索する式です。

    例1-基本的な使用法

    仕組みの例を次に示します。

    SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 12       |
    +----------+
    

    パーセント記号(% )は、0個以上の文字列を表すワイルドカード文字です。

    例2–一致なし

    ワイルドカード文字を含めない場合は、次のようになります。

    SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 0        |
    +----------+
    

    ただし、完全な文字列がワイルドカードなしのパターンと一致する場合は、一致するものが得られます:

    SELECT PATINDEX('Bob', 'Bob') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 1        |
    +----------+
    

    ただし、文字列にさらに多くの文字が含まれている場合、一致するものはありません:

    SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 0        |
    +----------+
    

    この場合、1つのワイルドカードを使用できます:

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

    結果:

    +----------+
    | Result   |
    |----------|
    | 1        |
    +----------+
    

    パターンの途中で1つのワイルドカードを使用することもできます:

    SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 1        |
    +----------+
    

    この場合、文字列の開始と終了がパターンの開始と終了と一致したため、一致しました。もちろん、他のすべての文字はパーセント記号で覆われているため、文字列の中央もパターンの中央と一致しました。

    例3–アンダースコアワイルドカード

    別のワイルドカード文字を紹介する別の例を次に示します。

    SELECT PATINDEX('B_er', 'Beer') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 1        |
    +----------+
    

    アンダースコア(_ )これは、任意の1文字のワイルドカードです。したがって、その位置にキャラクターが1人だけいる場合にのみ一致します。

    もちろん、上記のパターンは多くの異なる文字列に一致する可能性があります。例:

    SELECT 
      PATINDEX('B_er', 'Beer') AS 'Beer',
      PATINDEX('B_er', 'Bier') AS 'Bier',
      PATINDEX('B_er', 'Baer') AS 'Baer',
      PATINDEX('B_er', 'B er') AS 'B er';

    結果:

    +--------+--------+--------+--------+
    | Beer   | Bier   | Baer   | B er   |
    |--------+--------+--------+--------|
    | 1      | 1      | 1      | 1      |
    +--------+--------+--------+--------+
    

    例4– _の比較 および% ワイルドカード

    この例は、_の違いを示しています および% ワイルドカード文字。

    SELECT 
      PATINDEX('B%r', 'Beer') AS '%',
      PATINDEX('B_r', 'Beer') AS '_',
      PATINDEX('B__r', 'Beer') AS '__';

    結果:

    +-----+-----+------+
    | %   | _   | __   |
    |-----+-----+------|
    | 1   | 0   | 1    |
    +-----+-----+------+
    

    アンダースコアは、その位置に文字が1つだけある場合にのみ一致します。 2つの文字を一致させるには、2つのアンダースコアを使用する必要があります。

    一方、パーセント記号は、次の例に示すように、ゼロを含む任意の数の文字と一致します。

    SELECT 
      PATINDEX('Bee%r', 'Beer') AS '%',
      PATINDEX('Bee_r', 'Beer') AS '_',
      PATINDEX('Bee__r', 'Beer') AS '__';

    結果:

    +-----+-----+------+
    | %   | _   | __   |
    |-----+-----+------|
    | 1   | 0   | 0    |
    +-----+-----+------+
    

    例5–データベースの例

    データベースクエリでこの関数を使用する例を次に示します。

    USE Music;
    SELECT 
      AlbumName,
      PATINDEX('%the%', AlbumName) AS 'Pattern Index'
    FROM Albums
    WHERE PATINDEX('%the%', AlbumName) > 0;
    

    結果:

    +-------------------------+-----------------+
    | AlbumName               | Pattern Index   |
    |-------------------------+-----------------|
    | Singing Down the Lane   | 14              |
    | Ziltoid the Omniscient  | 9               |
    | No Prayer for the Dying | 15              |
    | The Sixteen Men of Tain | 1               |
    +-------------------------+-----------------+
    
    >

    この場合、私はWHEREを使用します PATINDEX()とともに実際に一致するアルバムのみを返す句 結果。 WHEREを削除した場合 条項では、一致するかどうかに関係なく、すべてのアルバムが返されます。

    一致しなかった場合は、PATINDEX() 結果はゼロになります。

    USE Music;
    SELECT TOP(10)
      AlbumName,
      PATINDEX('%the%', AlbumName) AS 'Pattern Index'
    FROM Albums;
    

    結果:

    +-------------------------+-----------------+
    | AlbumName               | Pattern Index   |
    |-------------------------+-----------------|
    | Powerslave              | 0               |
    | Powerage                | 0               |
    | Singing Down the Lane   | 14              |
    | Ziltoid the Omniscient  | 9               |
    | Casualties of Cool      | 0               |
    | Epicloud                | 0               |
    | Somewhere in Time       | 0               |
    | Piece of Mind           | 0               |
    | Killers                 | 0               |
    | No Prayer for the Dying | 15              |
    +-------------------------+-----------------+
    
    >

    例6–最初の発生のみ

    前述のように、PATINDEX() 最初ののみを返します 文字列内のパターンの出現。

    SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;

    結果:

    +----------+
    | Result   |
    |----------|
    | 5        |
    +----------+
    

    CHARINDEX() 機能

    T-SQL CHARINDEX() 関数はPATINDEX()に似ています 。ただし、この2つにはいくつかの違いがあります。特に、PATINDEX() ワイルドカード文字を受け入れますが、開始位置は受け入れません。 CHARINDEX() 一方、開始位置は受け入れますが、ワイルドカード文字は受け入れません。


    1. Oracle10gSQLピボット

    2. MySQLトリガーは、トリガーが割り当てられている同じテーブルの行を更新できません。推奨される回避策は?

    3. 可変列名を使用した動的更新ステートメント

    4. SQLServerのID列の増分値を返します