web-dev-qa-db-ja.com

PostgreSQLは日付昇順でソートし、最初にnullですか?

PostgreSQLテーブルを日付/時刻フィールドで昇順に並べ替える必要があります。 last_updated

しかし、そのフィールドは空またはnullにすることができ、last_updated comeにnullを含むレコードが必要ですbefore non-null last_updated
これは可能ですか?

order by last_updated asc /* and null last_updated records first ?? */
68
mhd

Postgresは、 NULLS FIRST | LAST のキーワードを提供し、ORDER BY句にそのニーズに正確に応えます。

... ORDER BY last_updated NULLS FIRST

typicalユースケースは降順のソート順(DESC)であり、デフォルトの昇順(ASC)の完全な反転(最初にnull値を使用)。多くの場合、望ましくありません-そのため、null値を最後に保持するには:

... ORDER BY last_updated DESC NULLS LAST

indexでクエリをサポートするには、一致させます:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgresはbtreeインデックスを逆方向に読み取ることができますが、NULL値が追加される場所は重要です。

135

CASEステートメントを使用して、カスタムORDER BYを作成できます。
CASEステートメントは条件をチェックし、その条件に一致する行に、条件に一致しない行に割り当てられる値よりも低い値を割り当てます。
例を挙げれば理解しやすいでしょう:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;
8
bernie