テストデータ
例えば、以下のテーブルがあるとする。
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) |