MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでNULL値を含む行だけを比較して表示する方法(IFNULL関数の活用)

NULL値が含まれる行のみを比較して抽出したい場合、IFNULL() 関数を利用するのが便利です。IFNULL() は、指定したカラムがNULLだった場合に代わりの値を返してくれるため、NULLを含む比較演算を正しく扱えるようになります。

ここでは、実際にテーブルを作成し、NULL値を持つ行を比較して表示する手順を解説します。

1. サンプルテーブルの作成

まず、以下のように2つのINT型カラムを持つテーブルを作成します。

mysql> create table DemoTable
(
    Value1 int,
    Value2 int
);
Query OK, 0 rows affected (0.75 sec)

2. テストデータの挿入

INSERTコマンドを使って、NULL値を含むレコードを挿入します。

mysql> insert into DemoTable values(10,NULL);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(20,40);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values(3,NULL);
Query OK, 1 row affected (0.20 sec)

3. 全レコードの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行すると、次のような結果が出力されます。

+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     10 | NULL   |
|     20 | 40     |
|      3 | NULL   |
+--------+--------+
3 rows in set (0.00 sec)

4. NULL値を含む行を比較して表示するクエリ

ここで本題のクエリです。WHERE句の中で IFNULL(Value2, 0) を使うことで、Value2 がNULLの場合は 0 として扱い、Value1 との比較を行います。

mysql> select *from DemoTable where Value1 > IFNULL(Value2,0);

実行結果は以下のとおりです。

+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     10 | NULL   |
|      3 | NULL   |
+--------+--------+
2 rows in set (0.00 sec)

このように、Value2 がNULLである行(Value1 = 10 と 3 の行)だけが抽出されました。Value2 が 40 である行は「10 > 40」「3 > 40」が成立しないため除外されています。

ポイント解説

SQLでは、NULLとの比較演算は常にUNKNOWN(不明)として評価されるため、通常の WHERE 句ではNULLを含む行が意図どおりに処理されないことがあります。IFNULL() を使えば、NULLを任意のデフォルト値(ここでは 0)に置き換えてから比較できるため、NULL値を含むデータでも安定した条件判定が可能になります。

  1. MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法

    MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1      (      DueDate date      ); Query OK, 0 ro

  2. MySQLでIN句に指定した値のみを任意の順序で表示する方法

    MySQLでIN句に指定した値のみを任意の順序で表示する方法MySQLでは、IN()とORDER BY句、さらにFIELD()関数を組み合わせることで、IN句内に指定した値だけを、希望する独自の順序で表示できます。通常のORDER BYは昇順・降順のソートしかできませんが、FIELD()関数を使えば自由に並び順を定義できるのがポイントです。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1986(Number int);Query OK, 0 rows affected (0.00 sec)次に、INSERTコマ