2012-03-01 124 views
50

我需要按日期/時間字段升序排序PostgreSQL表,例如, last_updatedPostgreSQL按datetime asc排序,先爲空?

但該字段允許爲空或空,我想記錄與空在last_updated前非空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 2012-03-01 06:42:56

回答

106

PostgreSQL提供了NULLS FIRST | LAST關鍵字的ORDER BY子句來滿足這一需求正是:

... ORDER BY last_updated NULLS FIRST 

一個典型使用情況按降序排序(DESC),這會首先使用空值完全反轉默認升序(ASC)。通常不可取的 - 所以,保持空值最後:

... ORDER BY last_updated DESC NULLS LAST 

爲了支持與指數查詢,使之匹配:

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

Postgres不能倒讀的B樹索引,但它的事項在那裏添加NULL值。

+1

之前沒有找到,我的google-fu不是那麼好。 Tnx – mhd 2012-03-01 06:42:05

+1

@mhd你沒有谷歌的「postgres第一次排序」? – 2013-03-29 14:33:02

+9

我做到了。這就是我得到這個頁面:) – ibrewster 2013-07-22 20:09:09

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 2012-03-01 04:29:28

+2

這是一個非常複雜的寫作'NULLS FIRST'的方式...... – 2013-03-29 15:02:18

+0

同意。它也是符合ANSI標準編寫'NULLS FIRST'的方式。 – bernie 2013-03-29 15:27:36