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