SQLのlikeの構文、DBMSごとの独自拡張や正規表現でのパターンマッチングについてまとめています。
SQL likeの構文
SQLのlikeの構文は以下の通り。以下の例では、employees(社員)テーブルから、first_name(姓名の名)がAで始まるレコードをワイルドカード文字(%)を使って指定しています。
SELECT * FROM employees WHERE first_name like 'A%';
実行するとこうなります。first_nameがAで始まるレコードが抽出されています。
+--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10033 | 1956-11-14 | Arif | Merlo | M | 1987-03-18 | | 10035 | 1953-02-08 | Alain | Chappelet | M | 1988-09-05 | | 10036 | 1959-08-10 | Adamantios | Portugali | M | 1992-01-03 | | 10039 | 1959-10-01 | Alejandro | Brender | M | 1988-01-19 | | 10059 | 1953-09-19 | Alejandro | McAlpine | F | 1991-06-26 | | 10062 | 1961-11-02 | Anoosh | Peyn | M | 1991-08-30 | | 10091 | 1955-10-04 | Amabile | Gomatam | M | 1992-11-18 | | 10094 | 1957-05-25 | Arumugam | Ossenbruggen | F | 1987-04-18 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | : :
【関連記事】
▶sql likeを使ったサンプル集 likeは本当に遅いのか?
DBMSごとのlike構文
Oracleのlike構文
Oracleのlike構文は以下の通り。
SELECT salary FROM employees WHERE last_name LIKE 'R%' ORDER BY salary;
Oracleには標準SQLのlike以外に、正規表現が使えるREGEXP_LIKEが用意されています。
以下は、REGEXP_LIKEによる、正規表現のパターンマッチングの例です。first_nameの値がStevenまたはStephenのデータを正規表現で条件指定しています。
SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$') ORDER BY first_name, last_name; FIRST_NAME LAST_NAME -------------------- ------------------------- Steven King Steven Markle Stephen Stiles
SQL Serverのlike構文
SQL Serverのlike構文は以下の通り。
-- ASCII pattern matching with char column CREATE TABLE t (col1 CHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1 LIKE '% King'; -- returns 1 row
SQL Serverには、大括弧を使って、「いずれか1文字にマッチする」という指定が可能です。
下記は、CかSいずれか1文字に一致する[]を使ったワイルドカードです。FirstNameの値がCherylまたはSherylにマッチします。
-- Uses AdventureWorks SELECT BusinessEntityID, FirstName, LastName FROM Person.Person WHERE FirstName LIKE '[CS]heryl'; GO
参考)LIKE (Transact-SQL) – SQL Server | Microsoft Docs
MySQLのlike構文
MySQLのlike構文は以下の通り。_(アンダースコア)は任意の一文字、%(パーセント文字)は任意帳の文字を表します。
mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
なお、照合順序によっては、likeで異なる結果になることがあります。以下の例では、照合順序latin1_german2_ciではマッチしないが、latin1_german2_ciではマッチする例。
mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci; +-----------------------------------------+ | 'ä' LIKE 'ae' COLLATE latin1_german2_ci | +-----------------------------------------+ | 0 | +-----------------------------------------+ mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci; +--------------------------------------+ | 'ä' = 'ae' COLLATE latin1_german2_ci | +--------------------------------------+ | 1 | +--------------------------------------+
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5.1 文字列比較関数
PostgreSQLのlike構文
postgreSQLのlike構文は以下の通り。ワイルドカード文字として、%と_(アンダースコア)が使用可能です。
'abc' LIKE 'abc' 真 'abc' LIKE 'a%' 真 'abc' LIKE '_b_' 真 'abc' LIKE 'c' 偽
また、postgreSQLではPOSIX正規表現によるパターンマッチングが用意されています。
チルダ記号「~」でPOSIXによる正規表現パターンマッチングになります。大文字小文字の区別あり・なしの指定も可能。
'thomas' ~ '.*thomas.*'
まとめ
- likeは、ワイルドカード文字でパターンマッチを行う演算子
- %は任意長の文字列、_(アンダースコア)は任意の一文字を表す
- DBMSによっては、独自の拡張や正規表現に対応しているものもあり。