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

MariaDBでのLIKEオペレーターのしくみ

    MariaDBでは、LIKE 演算子を使用すると、パターンマッチングを実行できます。特定の文字列が指定されたパターンと一致するかどうかを判別します。 1のいずれかを返します (TRUE)または0 (FALSE)。

    パターンには、通常の文字と%を含めることができます および_ ワイルドカード文字。

    これらのワイルドカード文字については、次の表で説明しています。

    ワイルドカード文字 説明
    % 0文字以上の任意の文字列に一致します。プレフィックスまたはサフィックスとして使用でき、文字列の途中でも使用できます。
    _ 任意の1文字に一致します。

    構文

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

    expr LIKE pat [ESCAPE 'escape_char']

    次の表があるとします。

    SELECT * FROM Pets;

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     2 |         3 |       3 | Fetch   | 2019-08-16 |
    |     3 |         2 |       2 | Scratch | 2018-10-01 |
    |     4 |         3 |       3 | Wag     | 2020-03-15 |
    |     5 |         1 |       1 | Tweet   | 2020-11-28 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    |     7 |         3 |       2 | Bark    | NULL       |
    |     8 |         2 |       4 | Meow    | NULL       |
    +-------+-----------+---------+---------+------------+

    LIKEがどのように行われるかを示す例を次に示します。 オペレーターが動作します。

    SELECT *
    FROM Pets
    WHERE PetName LIKE 'F%';

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     2 |         3 |       3 | Fetch   | 2019-08-16 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    +-------+-----------+---------+---------+------------+

    この例では、LIKEを使用しました %と組み合わせた演算子 名前が文字Fで始まるペットを返すワイルドカード演算子 。

    大文字と小文字の区別

    LIKE 式とパターンの照合で大文字と小文字が区別されない場合、大文字と小文字を区別しない部分文字列の一致を実行します。

    したがって、前の例を変更して、小文字のfを使用できます。 、それでも同じ結果が得られます:

    SELECT *
    FROM Pets
    WHERE PetName LIKE 'f%';

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     2 |         3 |       3 | Fetch   | 2019-08-16 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    +-------+-----------+---------+---------+------------+

    ただし、COLLATEを使用すると、大文字と小文字を区別して一致させることができます。 バイナリ照合を伴う句。または、CAST()を使用することもできます バイナリ文字列に強制変換します。

    例:

    SELECT *
    FROM Pets
    WHERE PetName LIKE 'f%' COLLATE utf8_bin;

    結果:

    Empty set (0.000 sec)

    結果は返されません。

    ただし、大文字のFに変更すると :

    SELECT *
    FROM Pets
    WHERE PetName LIKE 'F%' COLLATE utf8_bin;

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     2 |         3 |       3 | Fetch   | 2019-08-16 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    +-------+-----------+---------+---------+------------+

    予想どおり、3つの一致があります。

    数値引数

    数値引数は強制的にバイナリ文字列になります。

    SELECT * 
    FROM Pets 
    WHERE PetId LIKE 7;

    結果:

    +-------+-----------+---------+---------+------+
    | PetId | PetTypeId | OwnerId | PetName | DOB  |
    +-------+-----------+---------+---------+------+
    |     7 |         3 |       2 | Bark    | NULL |
    +-------+-----------+---------+---------+------+

    日付

    日付からの年に一致する例を次に示します。

    SELECT * 
    FROM Pets 
    WHERE DOB LIKE '2020%';

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     4 |         3 |       3 | Wag     | 2020-03-15 |
    |     5 |         1 |       1 | Tweet   | 2020-11-28 |
    |     6 |         3 |       4 | Fluffy  | 2020-09-17 |
    +-------+-----------+---------+---------+------------+

    LIKEを使用することもできます DAYNAME()などの日付関数の結果に対する演算子 、MONTHNAME() 、など。

    SELECT * 
    FROM Pets 
    WHERE MONTHNAME(DOB) LIKE 'Nov%';

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     1 |         2 |       3 | Fluffy  | 2020-11-20 |
    |     5 |         1 |       1 | Tweet   | 2020-11-28 |
    +-------+-----------+---------+---------+------------+

    _ ワイルドカード演算子

    アンダースコア(_ )ワイルドカード演算子は任意の1文字に一致します。

    例:

    SELECT *
    FROM Pets
    WHERE PetName LIKE '_e%';

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     2 |         3 |       3 | Fetch   | 2019-08-16 |
    |     8 |         2 |       4 | Meow    | NULL       |
    +-------+-----------+---------+---------+------------+

    この場合、2番目の文字がeであるペットの名前を照合しました 。

    エスケープ文字

    アンダースコアまたはパーセント記号を検索する必要がある状況に陥ることがあります。このような場合は、円記号(\)を使用できます。 )これらの文字をエスケープします。これにより、ワイルドカード文字として解釈されるのを防ぐことができます。

    次の表があるとします。

    SELECT * FROM Owners;

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    |       3 | Nancy     | Simpson  | (489) 591-0408 | NULL               |
    |       4 | Boris     | Trump    | (349) 611-8908 | NULL               |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
    +---------+-----------+----------+----------------+--------------------+

    所有者2(Bart)のメールアドレスにアンダースコアが含まれていることに注意してください。

    しないときに何が起こるかの例を次に示します。 アンダースコアをエスケープする:

    SELECT * FROM Owners
    WHERE Email LIKE 'b_%';

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
    +---------+-----------+----------+----------------+--------------------+

    この場合、2つの行に一致しました。この場合、2番目の文字が何であるかは問題ではありませんでした– anyと一致しました キャラクター。最初の行に2番目の文字の下線が含まれているという事実は、単なる偶然です。それが何か他のものであったとしても、それは一致したでしょう。

    しかし、2番目の文字として実際のアンダースコアを持つ電子メールアドレスのみを一致させたい場合はどうでしょうか?

    そこで、エスケープ文字が登場します。

    SELECT * FROM Owners
    WHERE Email LIKE 'b\_%';

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    +---------+-----------+----------+----------------+--------------------+

    これで、1つの行(2番目の文字としてアンダースコアを含む行)のみが取得されます。

    エスケープ文字の変更

    エスケープ文字を変更することができます。これは、ESCAPEを使用して行うことができます 引数。

    例:

    SELECT * FROM Owners
    WHERE Email LIKE 'b*_%' ESCAPE '*';

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    +---------+-----------+----------+----------------+--------------------+

    この場合、アスタリスク(*)を割り当てました )エスケープ文字として。

    これは、特殊文字のエンコードなど、他の目的で円記号を使用する必要がある場合に特に便利です。このような場合、これらの文字を「ダブルエスケープ」する必要があり、混乱を招く可能性があります。したがって、エスケープ文字を変更すると、そのような状況で役立ちます。

    NULL値

    パーセンテージ(% )ワイルドカードは何にでも一致します–ほぼ。一致しないものの1つは、NULLです。 。

    SELECT * FROM Owners
    WHERE Email LIKE '%';

    結果:

    +---------+-----------+----------+----------------+--------------------+
    | OwnerId | FirstName | LastName | Phone          | Email              |
    +---------+-----------+----------+----------------+--------------------+
    |       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
    |       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
    |       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
    |       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
    +---------+-----------+----------+----------------+--------------------+

    このテーブルには、NULLの2つの行があります Emailで 列ですが、ここには返されません。

    パフォーマンス

    LIKEを含むクエリ 演算子は他のクエリよりも実行速度が大幅に低下する可能性があるため、LIKEの使用はおそらく避けてください。 本当に必要でない限り、演算子。 %を使用する 接頭辞としての演算子は特に遅くなる可能性があります。

    それはあなたがそれを全く使うべきではないということではありません。 LIKE 演算子はSQLの不可欠な部分であり、それが唯一のオプション(または少なくとも最良のオプション)になる多くのシナリオに遭遇します。

    NOT LIKE オペレーター

    NOT LIKEを使用することもできます 文字列がしないかどうかをテストします パターンに一致します。


    1. SQL Serverにはパッケージがないので、プログラマーはそれを回避するために何をしますか?

    2. Postgres:タイムスタンプを最も近い分に切り上げるまたは切り下げるにはどうすればよいですか?

    3. PayPalODBCドライバー

    4. DATETIMEFROMPARTS()SQL Server(T-SQL)の例