したがって、OracleにはNULLS FIRSTがあります。これを使用して、NULL値を先頭に並べ替え、その後に列値を降順に並べ替えることができます。
ORDER BY date_sent NULLS FIRST
SQL Serverで比較できるものは何ですか?日付値がNULLまたは過去であると想定して、これらの代替手段があります。
ORDER BY ISNULL(date_sent, GETDATE()) DESC
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC
ORDER BY -CAST(date_sent as int) ASC
他のもの?
あなたはいくつかのトリックを行うことができます:
ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order]
簡単な答えは次のとおりです。必要な場合にnullの順序を変更するための最適なソリューションは、受け入れられたものです。しかし、必要なのは、それを使用するか、またはそのバリエーションを使用するだけです。
DESC + NULLS FIRST:
ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] DESC
ASC +最後のNULL:
ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC
ASC + NULLS FIRST:デフォルトで正常に動作します
DESC + NULLS LAST:デフォルトで正常に動作します
その理由を見てみましょう:
ORDER BY句(Transact-SQL)MSDNドキュメント を確認し、ASC | DESC
まで下にスクロールすると、次のように読むことができます。
ASC |説明
指定された列の値を昇順または降順でソートすることを指定します。 ASCは、最低値から最高値にソートします。 DESCは最高値から最低値にソートします。 ASCはデフォルトのソート順です。 Null値は、可能な最小値として扱われます。
したがって、デフォルトでASC
順序を指定すると、NULLS FIRST
のように機能します。また、DESC
を指定すると、NULLS LAST
のように機能します。
したがって、DESC
の順序でNULLS FIRST
の動作を変更し、ASC
の順序でNULLS LAST
の動作を変更するだけで済みます。
私見、必要な場合にnullの順序を変更するための最良の解決策は受け入れられたものですが、私は答えの最初にさまざまなケースに適応したものを含めました。
使用例/ Whenステートメント、例えば:
ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC
ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC
ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC
...等々。
または、列のタイプと最大値を気にしないのでさらに良いです。
ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC
現在の日付より古い日付の行があり、現在より古い日付の行がある場合、リストの中央にNULLSが表示されます。代わりに、リストの中央でソートされない値を使用する必要があります。
IsNull(Date_Sent、 '17530101')で並べ替えdesc
注:その日付は実際には1753年1月1日です。
簡単な例:
SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1
ORDER BY
COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
,OTHER_FIELDS
これは、並べ替え順序でのnullの表示方法を調整する場合の代替方法です。列を無効にし、並べ替え順序を逆にします。残念ながら、dateTime列をCASTする必要があります。
ORDER BY -CAST(date_sent as int) ASC
私の知る限り、これを制御することはできません。そして、ISNULL
を使用した正しいアプローチがあるようです。
文字列では、同じ目的でISNULL(field, '')
を使用しました。