2012-03-01 11 views
50

PostgreSQLのテーブルを日付/時刻フィールドで昇順に並べ替える必要があります。 last_updatedPostgreSQL sort by datetime asc、最初にnullを指定しますか?

しかし、そのフィールドが空またはnullであることを許され、私はlast_updatedにヌルのレコードを望んさは null以外last_updated来ます。
これは可能ですか?

order by last_updated asc /* and null last_updated records first ?? */ 
+0

が必要:またhttp://www.postgresql.org/docs/9.0/static/queries-order.html – mhd

答えて

106

PostgreSQLはまさにそのニーズに応えるためにORDER BY句のNULLS FIRST | LASTキーワードを提供します。

... ORDER BY last_updated NULLS FIRST 

典型的なユースケースがありますソート順が降順(DESC)で、デフォルト値の昇順(ASC)の完全な逆変換が最初にNULL値になります。多くの場合、望ましくない - そう、最後のnull値を維持するために:

... ORDER BY last_updated DESC NULLS LAST 

インデックスでクエリをサポートするために、それが一致します

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

Postgresは後方にbtreeインデックスを読むことができますが、それは重要NULL値が追加されます。念のため

+1

これまでに私のgoogle-fuはあまり良くありませんでした。 Tnx – mhd

+1

@mhdあなたはGoogleで「postgres sort null first? –

+9

でした。それは私がこのページを持っている方法です:) – ibrewster

8

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; 
+1

、しかし、あなたはおそらくこれを知っている、 'ASC'はそうしないように、ソート順をデフォルトであります必ず入力する必要があります。 – bernie

+2

それは 'NULLSFIRST'を書くのはかなり複雑な方法です... –

+0

合意。また、 'NULLSFIRST'を書くためのANSI準拠の方法です。 – bernie

関連する問題