3.3.4.7 パターンマッチ
MySQL は標準SQLパターンマッチと vi, grep, sedなどのUnixユーティリティで使われるのと同様の拡張正規表現に基づいたパターンマッチを提供します。
SQL パターン マッチングでは、_
を使用して任意の 1 文字に、%
を使用して任意の文字数 (0 文字を含む) にマッチさせることができます。 MySQL では、SQL パターンはデフォルトで大文字と小文字が区別されません。 ここにいくつかの例を示します。 SQL パターンを使用する場合、=
または <>
を使用しないでください。 代わりに LIKE
または NOT LIKE
比較演算子を使用してください。
b
で始まる名前を検索する場合。
mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
fy
で終わる名前を検索する場合。
mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
w
を含む名前を見つけるには。
mysql> SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
ちょうど5文字を含む名前を見つけるには、 _
パターン文字の5つのインスタンスを使用します。
mysql> SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
MySQL が提供するもう一つのパターン マッチングは拡張正規表現を使用します。 このタイプのパターンに一致するかどうかをテストするときは、REGEXP_LIKE()
関数 (または REGEXP_LIKE()
の同義語である REGEXP
または RLIKE
演算子) を使用します。
-
.
は任意の1文字にマッチします。 -
文字クラス
は、括弧内の任意の文字にマッチします。 例えば、
は
a
,b
,c
のいずれかにマッチする。 文字の範囲を指定する場合は、ダッシュを使用する。は任意の文字にマッチしますが、
は任意の数字にマッチします。
-
*
は、その前にあるものの0個以上のインスタンスにマッチします。 例えば、x*
は任意の数のx
文字に、*
は任意の数の数字に、.*
は任意の数の何れかにマッチする。 -
正規表現のパターンマッチは、テストされる値のどこかにパターンがマッチすれば成功する。 (これは、パターンが値全体にマッチする場合にのみ成功する
LIKE
パターンマッチとは異なる)。 -
テストされる値の最初か最後にマッチするようにパターンを固定するには、パターンの最初で
^
を、最後で$
を使用すること。b
で始まる名前を見つけるには、^
を使用して名前の先頭にマッチさせます。mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
正規表現の比較を大文字小文字を区別して行うには、大文字小文字を区別する照合順序を使用するか、
BINARY
キーワードを使って文字列の1つをバイナリ文字列にするか、c
match-control character を指定します。 これらの各クエリは、名前の先頭にある小文字のb
のみにマッチします。SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
fy
で終わる名前を見つけるには、$
を使って名前の最後をマッチさせます。mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
w
を含む名前を見つけるには、このクエリを使用します。ちょうど5文字を含む名前を見つけるには、
^
と$
を使用して名前の最初と最後にマッチし、その間に.
のインスタンスを5つ使用します。mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
また、
{
(“repeat-n
}n
-times”) 演算子を使用して、前のクエリを記述することもできます。mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
正規表現の構文についての詳細は、「正規表現」セクション12.8.2を参照してください。