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でソートした時に最後に表示するでした。
