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

2019/11/13データベースSQLServer

記事内に広告が含まれています。

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

 

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ