🦁
MySQL ORDER BYでnullは後で取得したい
MySQLで何かしらの条件でデータを取得したい時
例えば順番を任意で指定できるようなカラムがある場合
sort_orderの昇順で並び替えた後にnullのユーザーが続くこと
name, sort_order
山田, 3
田中, 1
大江, 4
佐伯, 2
その他大勢, null
SELECT * FROM users ORDER BY sort_order ASC;
とするとnullが先に来てしまいます。
sort_orderを持っているUserは昇順で並んで欲しいのでDESCでは要件を満たせません。
調べるとやり方はすぐ出てきます。
SELECT * FROM users ORDER BY sort_order IS NULL ASC, sort_order ASC;
です。
が、これがなぜか納得いかなかったのでちゃんと確認してみました。
SELECT
sort_order IS NULL as sort_order_null
sort_order
ORDER BY sort_order IS NULL ASC, sort_order ASC;
ORDER BYに複数の条件を指定すると最初の条件でソートが行われます。
まずsort_order IS NULLでNULLであれば1、NULLでなければ0が返ってくるので、昇順で並び替えるとsort_orderがあるものが0なので上に、NULLは下に並べ替えられます。
その後0のブロックと1のブロックそれぞれでsort_order ASCが適用されるので、sort_orderがあるものはsort_order昇順に並ぶということでした。
スッキリ。
Discussion