MySQLのORDER BY ASCでNULL値を最下部に表示する方法
MySQLのORDER BY ASCでNULL値を最下部に表示する方法
MySQLでは、ORDER BY句を昇順(ASC)で使用した場合、デフォルトではNULLが先頭(上部)に表示されます。しかし実務では、「NULLは一番下に表示したい」というケースがよくあります。このような場合には、CASE式とORDER BYを組み合わせることで簡単に実現できます。
この記事では、NULLや空文字列('')を含むデータを昇順ソートしつつ、NULLを最下部に表示する方法を、具体的なサンプルコードとともに解説します。
1. サンプルテーブルの作成
まず、テーブルを作成します。
mysql> create table DemoTable1937
(
Name varchar(20)
);
Query OK, 0 rows affected (0.00 sec)
2. レコードの挿入
insertコマンドを使って、いくつかのレコードを挿入します。ここではNULLと空文字列も含めています。
mysql> insert into DemoTable1937 values('Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values(NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('Adam');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('John');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values(NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1937 values('Bob');
Query OK, 1 row affected (0.00 sec)3. テーブル内の全レコードを表示
select文ですべてのレコードを確認してみましょう。
mysql> select * from DemoTable1937;
実行結果は以下の通りです。
+-------+
| Name |
+-------+
| Chris |
| NULL |
| Adam |
| John |
| |
| NULL |
| Bob |
+-------+
7 rows in set (0.00 sec)
4. 昇順ソートでNULLを最下部に表示するクエリ
以下が、昇順ソートを行いながらNULLを最下部に表示するクエリです。
mysql> select * from DemoTable1937
order by case when Name IS NULL then 100
when Name='' then 101
else 103
end desc
,
Name asc;
実行結果は以下の通りです。
+-------+
| Name |
+-------+
| Adam |
| Bob |
| Chris |
| John |
| |
| NULL |
| NULL |
+-------+
7 rows in set (0.00 sec)
クエリのポイント解説
このクエリでは、CASE式を使って各レコードに優先度を示す数値を割り当てています。
- Name IS NULL の場合: 100 を返す
- Name = ''(空文字列)の場合: 101 を返す
- それ以外の場合: 103 を返す
第1ソートキーとしてこのCASE式の結果を降順(DESC)で並べることで、数値が大きい通常の名前(103)が先頭に来て、次に空文字列(101)、最後にNULL(100)が配置されます。さらに第2ソートキーとしてName ascを指定しているため、通常の名前同士はアルファベットの昇順に整列します。
その結果、「Adam → Bob → Chris → John → ''(空文字列)→ NULL → NULL」のように、NULLを最下部に配置した自然な昇順ソートが実現できます。NULLの扱いに悩んだときは、このCASE式による優先度付けのテクニックを活用してみてください。
-
MySQLで特定の値を先頭に表示し、残りのレコードを昇順で並べ替える方法
はじめにMySQLでは、ORDER BY句に条件式を組み合わせることで、特定の値を持つ行を最前面に表示し、残りの行を昇順で並べ替えることができます。この記事では、具体的な手順をサンプルコードとともに解説します。テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> MonthNumber int -> );Query OK, 0 rows affected (1.68 sec)レコードの挿入次に、INSERTコマンドを使ってテーブルに複数のレコードを挿入します。mysql>
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入