MariaDBでは、NOT LIKE
演算子は、文字列がしないかどうかをテストするために使用されます パターンに一致します。 LIKE
の逆を返します オペレーター。 NOT
を適用するのと同じです LIKE
全体に対する演算子 表現。
パターンには、通常の文字と%
を含めることができます および_
ワイルドカード文字。
これらのワイルドカード文字については、次の表で説明しています。
ワイルドカード文字 | 説明 |
---|---|
% | 0文字以上の任意の文字列に一致します。プレフィックスまたはサフィックスとして使用でき、文字列の途中でも使用できます。 |
_ | 任意の1文字に一致します。 |
構文
構文は次のようになります:
expr NOT 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 | +-------+-----------+---------+---------+------------+
NOT LIKE
の使用例を次に示します。 そのテーブルに対して:
SELECT *
FROM Pets
WHERE PetName NOT LIKE 'F%';
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
この例では、NOT LIKE
を使用しました %
と組み合わせて 名前がではないペットを返すワイルドカード演算子 文字F
で始まります 。
これは、LIKE
を使用した場合とは逆の結果セットです。 。その場合、ペットの名前が文字F
で始まる場合にのみ結果が得られます。 。
大文字と小文字の区別
NOT LIKE
式とパターンの照合で大文字と小文字が区別されない場合、大文字と小文字を区別しない部分文字列の一致を実行します。
したがって、前の例を変更して、小文字のf
を使用できます。 、それでも同じ結果が得られます:
SELECT *
FROM Pets
WHERE PetName NOT LIKE 'f%';
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
ただし、COLLATE
を使用すると、大文字と小文字を区別して一致させることができます。 バイナリ照合を伴う句。または、CAST()
を使用することもできます バイナリ文字列に強制変換します。
例:
SELECT *
FROM Pets
WHERE PetName NOT LIKE 'f%' COLLATE utf8_bin;
結果:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
今回は、テーブル全体が返されました。これは、小文字のf
に一致するものがないためです。 。
ただし、大文字のF
に変更すると :
SELECT *
FROM Pets
WHERE PetName NOT LIKE 'F%' COLLATE utf8_bin;
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
予想通り、5試合があります。ペット名がF
で始まる行 除外されます。
数値引数
数値引数は強制的にバイナリ文字列になります。
SELECT *
FROM Pets
WHERE PetId NOT LIKE 1;
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
日付
日付の例は次のとおりです:
SELECT *
FROM Pets
WHERE DOB NOT LIKE '2020%';
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +-------+-----------+---------+---------+------------+
NOT LIKE
を使用することもできます DAYNAME()
などの日付関数の結果に対する演算子 、MONTHNAME()
、など。
SELECT *
FROM Pets
WHERE MONTHNAME(DOB) NOT LIKE 'Nov%';
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
_
ワイルドカード演算子
アンダースコア(_
)ワイルドカード演算子は任意の1文字に一致します。
例:
SELECT *
FROM Pets
WHERE PetName NOT LIKE '_e%';
結果:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 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 | +-------+-----------+---------+---------+------------+
この場合、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 NOT LIKE 'b_%';
結果:
+---------+-----------+----------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+-------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +---------+-----------+----------+----------------+-------------------+
この場合、2行だけが返されました。メールアドレスがb
で始まる2行を除外しました 、およびその後に他の1文字が続き、その後に任意の数の文字が続きます。また、null
の行も除外しました メールアドレス。
ただし、アンダースコアをエスケープしなかったため、2番目の文字が何であるかは問題ではありませんでした。任意のと一致しました。 キャラクター。最初の行に2番目の文字の下線が含まれているという事実は、単なる偶然です。それが何か他のものであったとしても、それは一致したでしょう。
しかし、2番目の文字として実際のアンダースコアを持つ電子メールアドレスのみを一致させたい場合はどうでしょうか?
そこで、エスケープ文字が登場します。
SELECT * FROM Owners
WHERE Email NOT LIKE 'b\_%';
結果:
+---------+-----------+----------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+-------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+-------------------+
結果にバートが追加されていることがわかります。
エスケープ文字の変更
エスケープ文字を変更することができます。これは、ESCAPE
を使用して行うことができます 引数。
例:
SELECT * FROM Owners
WHERE Email NOT LIKE 'b*_%' ESCAPE '*';
結果:
+---------+-----------+----------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+-------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+-------------------+
この場合、アスタリスク(*
)を割り当てました )エスケープ文字として。
これは、特殊文字のエンコードなど、他の目的で円記号を使用する必要がある場合に便利です。このような場合、これらの文字を「ダブルエスケープ」する必要があり、混乱を招く可能性があります。したがって、エスケープ文字を変更すると、そのような状況で役立ちます。