MySQL
SQL

SQLで検索する時、空白やNULLのデータを後ろに並べたい

テストデータ

例えば、以下のテーブルがあるとする。

id name age type
1 佐藤 一郎 21 A
2 鈴木 次郎 27
3 高橋 三郎 22 A
4 田中 四郎 26 (NULL)
5 伊藤 五郎 23 F
6 渡辺 六郎 25 E
7 山本 七郎 24 R

このテーブルのtypeで整列させたい場合、何も考えずに書くと下記のようになると思う。

SELECT * FROM table_name ORDER BY type ASC;

ところが、この場合の抽出結果は、残念ながらこちら。

id name age type
4 田中 四郎 26 (NULL)
2 鈴木 次郎 27
1 佐藤 一郎 21 A
3 高橋 三郎 22 A
6 渡辺 六郎 25 E
5 伊藤 五郎 23 F
7 山本 七郎 24 R

データが入ってないなら、後ろへ

「これで良いや」という場合もあるし、「空白とか入らないようにしろよ」という考えもある。
しかし、世の中どうしようもない時がある。(うちのシステムみたいに、既に稼働中だったり)
そんな時には、

SELECT * FROM table_name ORDER BY
case
    when type is NULL then '2'
    when type = '' then '1'
    else '0'
end, type ASC;

で、解決できる。
「ちゃんと入力されているレコード」 < 「空白」< 「NULL」で先に並べてからソートする訳です。

id name age type
1 佐藤 一郎 21 A
3 高橋 三郎 22 A
6 渡辺 六郎 25 E
5 伊藤 五郎 23 F
7 山本 七郎 24 R
2 鈴木 次郎 27
4 田中 四郎 26 (NULL)