SQLServerで検索時Order BYでNULLのデータを後ろに並べる方法

2019-11-13SQLServer

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のデータを後ろに並べる方法」でした。