SQLServerで検索時Order BYでNULLのデータを後ろに並べる方法
SQLServerでNULL値を含む列をASC(昇順・小さいもの順)でソートした場合NULLを含む行は前にソートされます。
これを最後にするにはOracleではORDER BY句にNULLS LASTオプションをつけることで実現できますが、SQLServerにはそのようなオプションは用意されていません。
そこでちょっとした一工夫が必要になります。
SQLServerで検索時NULLのデータを後ろに並べる方法
OracleでORDER BYでNULLの列を後ろに持っていくには専用のオプションが用意されており
SELECT name, idx FROM test_table ORDER BY idx ASC NULLS LAST;
とORDER BY句にNULLS LASTオプションをつけることで実現できます。
SQLServerにはNULLS LASTオプションのようなものはないので、一工夫が必要です。
実際にはソートされる列がNULLの場合は設計上あり得ないような大きな数値に変換するのが簡単にできる方法でしょう。
具体的には
SELECT name AS name ,idx AS idx FROM( SELECT 'name2' AS name ,2 AS idx UNION SELECT 'name-null' AS name ,NULL AS idx UNION SELECT 'name1' AS name ,CAST(1 AS SMALLINT) AS idx ) AS tbl GROUP BY name ,idx ORDER BY CASE WHEN idx IS NULL THEN 200 ELSE idx END
のようにCASE WHNEを使ってNULL値を大きな数字に変換してしまいます。
CASE WHNEはISNULL関数でも構いません。
SELECT name AS name ,idx AS idx FROM( SELECT 'name2' AS name ,2 AS idx UNION SELECT 'name-null' AS name ,NULL AS idx UNION SELECT 'name1' AS name ,CAST(1 AS SMALLINT) AS idx ) AS tbl GROUP BY name ,idx ORDER BY ISNULL(idx,200)
どちらで実行した場合でも結果は
name | idx |
---|---|
name1 | 1 |
name2 | 2 |
name-null | NULL |
になります。
まとめ
Oracleに用意されているようなNULLS LASTオプションはSQLServerには用意されていないので、一工夫が必要です。
それほど複雑にはならないということでSQLServerには用意されていないのかもしれません。
以上、「SQLServerで検索時Order BYでNULLのデータを後ろに並べる方法」でした。