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 |+-------+--------+---------+------+------------+-------+

    また、{n} (“repeat-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を参照してください。

コメントを残す

メールアドレスが公開されることはありません。