MySQLのIFNULL()関数を使ってNULL値を含む日付レコードを並べ替える方法
IFNULL()関数でNULL値の日付を扱う
MySQLでは、IFNULL()関数を使用することで、NULL値を別の値に置き換えて処理できます。この関数は、第1引数がNULLでなければその値を返し、NULLであれば第2引数の代替値を返します。
本記事では、updated_dateがNULLの場合にadded_dateの値を代わりに使い、レコードを昇順・降順に並べ替える方法を具体的なサンプルコードとともに解説します。
ステップ1:サンプルテーブルを作成する
まず、テーブルを作成しましょう。
mysql> create table DemoTable -> ( -> added_date date, -> updated_date date -> ); Query OK, 0 rows affected (0.95 sec)
ステップ2:レコードを挿入する
INSERT文を使って、いくつかのレコードをテーブルに挿入します。意図的にNULL値を含むデータも用意しています。
mysql> insert into DemoTable values('2019-01-10','2019-06-01');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('2019-05-19',NULL);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(NULL,'2019-09-05');
Query OK, 1 row affected (0.18 sec)
ステップ3:テーブル内の全レコードを表示する
SELECT文で、登録されたすべてのレコードを確認します。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------------+--------------+ | added_date | updated_date | +------------+--------------+ | 2019-01-10 | 2019-06-01 | | 2019-05-19 | NULL | | NULL | 2019-09-05 | +------------+--------------+ 3 rows in set (0.00 sec)
ケース1:降順(DESC)で並べ替える場合
updated_dateがNULLのレコードはadded_dateの値で代用しながら、結果を降順で取得したい場合は、以下のクエリを実行します。
mysql> select *from DemoTable order by ifnull(updated_date,added_date) desc;
実行結果は以下の通りです。updated_dateがNULLの「2019-05-19」の行は、added_dateの値がソートに使われていることがわかります。
+------------+--------------+ | added_date | updated_date | +------------+--------------+ | NULL | 2019-09-05 | | 2019-01-10 | 2019-06-01 | | 2019-05-19 | NULL | +------------+--------------+ 3 rows in set (0.00 sec)
ケース2:昇順(ASC)で並べ替える場合
逆に、結果を昇順で取得したい場合は、DESCを外した以下のクエリを使用します。
mysql> select *from DemoTable order by ifnull(updated_date,added_date);
実行結果は以下の通りです。
+------------+--------------+ | added_date | updated_date | +------------+--------------+ | 2019-05-19 | NULL | | 2019-01-10 | 2019-06-01 | | NULL | 2019-09-05 | +------------+--------------+ 3 rows in set (0.00 sec)
まとめ
IFNULL(updated_date, added_date)のように記述することで、updated_dateがNULLの場合には自動的にadded_dateの値がソートキーとして使用されます。この手法は、更新日が未設定のレコードを登録日に基づいて正しく並べ替えたい場合など、実務でも非常に役立ちます。同様の目的にはCOALESCE()関数も利用できるため、状況に応じて使い分けるとよいでしょう。
-
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
-
MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方
MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ