MySQLでWHERE IN句とNULLを組み合わせてレコードを取得する方法
MySQLでは、WHERE IN句を使った検索時にNULL値を含む行も取得したいケースがあります。しかし、NULLは通常の比較演算子では正しく評価されないため、IS NULLを組み合わせる必要があります。本記事では、その具体的な方法をサンプルコードとともに解説します。
基本の構文
NULLを含めて検索する場合の基本的な構文は以下のとおりです。ポイントは、IN句の条件に加えて OR カラム名 IS NULL を追加することです。
SELECT yourColumnName1, yourColumnName2, yourColumnName3, ... N FROM yourTableName WHERE yourValue IN (yourColumnName1, yourColumnName2) OR yourColumnName1 IS NULL;
サンプルテーブルの作成
まず、動作確認用のテーブルを作成します。
mysql> CREATE TABLE demo60 -> ( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> first_name VARCHAR(20), -> last_name VARCHAR(20) -> ); Query OK, 0 rows affected (2.11 sec)
テストデータの挿入
次に、INSERT文を使っていくつかのレコードを挿入します。ここで意図的にfirst_nameがNULLのレコードも含めています。
mysql> INSERT INTO demo60(first_name, last_name) VALUES('John', 'Smith');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('John', 'Doe');
Query OK, 1 row affected (0.51 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES(NULL, 'Brown');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('David', 'Miller');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('David', 'Smith');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO demo60(first_name, last_name) VALUES('Chris', 'Brown');
Query OK, 1 row affected (0.12 sec)登録データの確認
SELECT文でテーブルの中身を表示してみましょう。
mysql> SELECT * FROM demo60;
実行すると、以下のような結果が得られます。
+----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | John | Smith | | 2 | John | Doe | | 3 | NULL | Brown | | 4 | David | Miller | | 5 | David | Smith | | 6 | Chris | Brown | +----+------------+-----------+ 6 rows in set (0.00 sec)
WHERE IN句とNULLを組み合わせたクエリ
それでは、'John'という値がfirst_nameまたはlast_nameに含まれる行に加えて、first_nameがNULLの行も取得するクエリを実行します。
mysql> SELECT -> id, -> first_name, -> last_name -> FROM demo60 -> WHERE 'John' IN (first_name, last_name) -> OR first_name IS NULL;
実行結果は以下のとおりです。
+----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | John | Smith | | 2 | John | Doe | | 3 | NULL | Brown | +----+------------+-----------+ 3 rows in set (0.00 sec)
結果のポイント
上記の出力を見ると、以下の3行が取得されています。
- id=1:first_nameが「John」のため、IN句の条件に一致
- id=2:last_nameが「Doe」ではなくfirst_nameが「John」のため一致
- id=3:first_nameがNULLのため、
IS NULL条件に一致
このように、NULLはIN句の比較では一致しないため、NULLの行を結果に含めたい場合は必ず OR カラム名 IS NULL を併用するのがポイントです。
-
MySQLのWHERE句で日付の差を計算して行を抽出する方法(TIMESTAMPDIFFの使い方)
MySQLでは、TIMESTAMPDIFF() 関数を使うことで、日時同士の差分を計算し、その結果に基づいてWHERE句で行を絞り込むことができます。ここでは、指定した日時との差が5分以内のレコードを抽出する例を紹介します。サンプルテーブルの作成まず、datetime型のカラムを持つテーブルを作成しましょう。mysql> create table demo42 -> ( -> start_date datetime -> ); Query OK, 0 rows affected (0.77 sec)テーブルへのデータ挿入次に、INSERT文を使っていくつかの日時データを
-
MySQLでカンマ区切りの文字列から特定の値を検索・選択する方法
カンマ区切りで保存された文字列の中に、特定の値が含まれているかを確認して行を抽出したい場合があります。そのようなときは、MySQLの FIND_IN_SET() 関数を使用すると便利です。FIND_IN_SET() は、第1引数に検索したい文字列、第2引数にカンマ区切りの文字列を指定し、見つかった位置(1始まり)を返します。見つからない場合は0が返されるため、「0より大きい」という条件と組み合わせることで、該当するレコードだけを取得できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo81 -> ( ->