ORDER BYでNULLのカラムをASCでソートした時に最後に表示する方法

SQLServerでNULL値を含む列をASC(昇順・小さいもの順)でソートした場合NULLを含む行は前にソートされます。

NULLを最後に持ってくるにはちょっとした工夫が必要になります。

スポンサーリンク

ORDER BYでNULLのカラムを最後に持ってくる

SQLで何も考慮せずに「ORDER BY」するとNULLのカラムは先頭に表示されます。

ちなみにOracleでORDER BYでNULLの列を後ろに持っていくには専用のオプションが用意されており

SELECT name, idx FROM test_table ORDER BY idx ASC NULLS LAST;

とすることでNULLを検索結果の最後に表示することができます。

でもSQLServerにはNULLS LASTオプションは定義されていないので、自力でなんとかするしかないです。

NULLの行は先頭に表示されるパターン

CREATE TABLE test_table
(
name VARCHAR(20)
,age int
)
INSERT INTO test_table (name, age) VALUES('一郎',10)
INSERT INTO test_table (name, age) VALUES('次郎',NULL)
INSERT INTO test_table (name, age) VALUES('三郎',30)

--NULLの行が先頭に来る
SELECT
*
FROM
test_table
ORDER BY
age

DROP TABLE test_table

name age
次郎 NULL
一郎 10
三郎 30

NULLの行は最後に表示されるパターン

NULLを最後に持っていくには「CASE WHEN」を使って一工夫します。

CREATE TABLE test_table
(
name VARCHAR(20)
,age int
)
INSERT INTO test_table (name, age) VALUES('一郎',10)
INSERT INTO test_table (name, age) VALUES('次郎',NULL)
INSERT INTO test_table (name, age) VALUES('三郎',30)

--NULLの行が最後に来る
SELECT
*
FROM
test_table
ORDER BY
CASE WHEN age IS NULL THEN 1 ELSE 0 END
,age
DROP TABLE test_table

name age
一郎 10
三郎 30
次郎 NULL

「CASE WHEN」でNULLの行を「1」に変換し、NULL以外を「0」に変換します。
これでNULLの行は後ろに行くのであとは当初の目的の
「age」でソートすれば欲しい結果を取得することができます。

まとめ

SQLserverではORDER BYでNULLのカラムをASCでソートした時に最後に表示するにはちょっとした一工夫が必要ですが、難しくはないので覚えておきましょう。

以上、ORDER BYでNULLのカラムをASCでソートした時に最後に表示するでした。

タイトルとURLをコピーしました