SQLの含む条件指定についてまとめています。
SQLの「含む」条件はLIKEとワイルドカードで部分一致指定
LIKEはワイルドカード指定であいまい検索をおこなう条件指定です。
以下は、first_name(姓名の名)に「em」を含むものを取得するSQLです。※MySQL で実行しています。
SELECT * FROM employees WHERE first_name like '%em%' limit 10; +--------+------------+-------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+-------------+-------------+--------+------------+ | 10080 | 1957-12-03 | Premal | Baek | M | 1985-11-19 | | 10097 | 1952-02-27 | Remzi | Waschkowski | M | 1990-09-15 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | | 10145 | 1956-03-30 | Akemi | Esposito | F | 1987-08-01 | | 10195 | 1963-11-13 | Annemarie | Redmiles | M | 1985-02-15 | | 10240 | 1952-04-01 | Remko | Maccarone | M | 1998-10-06 | | 10246 | 1962-06-23 | Basem | Teitelbaum | M | 1987-07-12 | | 10329 | 1958-04-28 | Remko | Shigei | F | 1986-01-20 | | 10473 | 1963-10-13 | Przemyslawa | Oskamp | M | 1987-10-30 | | 10538 | 1955-08-18 | Przemyslawa | Falby | M | 1987-07-23 | +--------+------------+-------------+-------------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLの部分一致にはlikeとワイルドカードを指定 中間一致指定も可能
「特定の月を含む」日付を検索
like指定は、日付型、時刻型のカラムにも適用可能です。※MySQLの場合
以下は、hire_date(雇用年月日)に、4月を含むデータを取得するSQLです。条件指定でlikeで「-04-」を含む指定をおこなっています。
SELECT * FROM employees WHERE hire_date like '%-04-%' limit 10; +--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | | 10055 | 1956-06-06 | Georgy | Dredge | M | 1992-04-27 | | 10058 | 1954-10-01 | Berhard | McFarlin | M | 1987-04-13 | | 10063 | 1952-08-06 | Gino | Leonhardt | F | 1989-04-08 | | 10085 | 1962-11-07 | Kenroku | Malabarba | M | 1994-04-09 | | 10094 | 1957-05-25 | Arumugam | Ossenbruggen | F | 1987-04-18 | | 10104 | 1961-11-19 | Xinyu | Warwick | M | 1987-04-16 | | 10151 | 1959-03-06 | Itzchak | Lichtner | M | 1990-04-10 | | 10153 | 1955-12-15 | Heekeun | Majewski | M | 1987-04-08 | +--------+------------+------------+--------------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶MySQL likeのサンプルコード集 複数のパターンマッチングをするには?
ただし、この方法はSQL標準の記述ではありません。データベースによっては、カラムをいったん文字列型に変換してからlikeで条件指定をおこなう必要があります。
複数の「含む」条件を指定するには、andで接続する
複数の含む指定を行うには、likeによるあいまい検索指定をandで接続します。
以下の例は、hire_date(雇用年月日)に「4月」を含み、first_name(姓名の名)に「in」を含むデータを抽出するSQLです。
SELECT * FROM employees WHERE hire_date like '%-04-%' and first_name like '%in%' limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10063 | 1952-08-06 | Gino | Leonhardt | F | 1989-04-08 | | 10104 | 1961-11-19 | Xinyu | Warwick | M | 1987-04-16 | | 10245 | 1962-08-23 | Ramalingam | Gente | F | 1985-04-26 | | 10437 | 1956-07-07 | Narain | Reeker | F | 1996-04-12 | | 10850 | 1963-01-01 | Florina | Schapire | F | 1990-04-22 | | 10902 | 1964-05-09 | Inderjeet | Perly | M | 1990-04-22 | | 10919 | 1961-09-04 | Reinhard | Lindenbaum | M | 1987-04-19 | | 11242 | 1958-12-27 | Jinya | Camurati | F | 1989-04-30 | | 11266 | 1955-08-09 | Florina | Rohrbach | M | 1995-04-04 | | 11305 | 1960-12-22 | Augustine | Schwabacher | F | 1986-04-11 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLのワイルドカードは、like句にマッチング文字列を指定
まとめ
- 特定の文字列を含む条件指定には、likeを使う
- 日付型、時刻型にも「含む」条件指定が可能
- 複数の含む条件指定を行うには、条件をandで接続する