🦁

MySQL ORDER BYでnullは後で取得したい

2023/07/25に公開

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