2012-03-01 121 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