2009-09-09 41 views
6

我有一个简单的表,如:int id, date created_at, date updated_at。我想订购这些行,以便任何具有updated_at的行都将按该排序排序,而不会按created_at排序。问题是这样的:SQLite中的多个字段排序

SELECT * FROM table ORDER BY updated_at, created_at 

不起作用。我一直在看自定义订单条款,如:

ORDER BY CASE WHERE updated_at ISNULL <do something> END, created_at 

但似乎无法得到任何工作。 帮助?

编辑: 我应该已经指定了我想要的updated_at领域的created_at场之前进行排序。所以,如果数据的模样:

id created_at updated_at 
-- ---------- ---------- 
1 2009-01-08 null 
2 2009-09-08 null 
3 2009-07-02 null 
4 2009-09-05 2009-09-06 
5 2009-04-01 null 
6 2009-09-07 2009-09-08 

我想类似的结果:

id created_at updated_at 
-- ---------- ---------- 
6 2009-09-07 2009-09-08 
4 2009-09-05 2009-09-06 
2 2009-09-08 null 
3 2009-07-02 null 
5 2009-04-01 null 
1 2009-01-08 null 
+0

根据您的更新更新了我的答案。 – 2009-09-09 04:12:32

回答

17

看起来就像你正在寻找:

the docs
ORDER BY COALESCE(updated_at, created_at) 

,​​3210回报

第n个副本on-NULL参数。 如果所有参数均为NULL,则返回NULL为 。必须至少有2 参数。

编辑:鉴于OP的编辑,他可能反而想:

ORDER BY COALESCE(updated_at, '1929-9-9') DESC, created_at DESC 

或类似的技巧降序排序;也许

ORDER BY MAX(COALESCE(updated_at, '1929-9-9'), created_at) DESC 

这是不可能告诉OP从单一的和非常特殊的例子想要什么,但对其中一些方法一个变体应该解决他的实际问题,不管这个问题实际上可能是在特定的,精确和完整的细节。

3

IFNULL,看到here

在这种情况下你会使用类似:

IFNULL(的updated_at, '1-JAN-2100'),created_at

所有列没有的updated_at场会被赋予默认的排序顺序,然后按照created_at进行排序。 1-jan-2100的值确保它们出现在列表的最后。如果您首先需要,请将其更改为1900。

+0

谢谢,那真是超级有用,但它并不完全符合我的要求,因为我的问题措辞不佳。编辑。 – 2009-09-09 03:48:43

0

我知道这并不完全回答你的问题,但它是一种替代解决方案。

如果你到updated_at字段设置为相同created_at上创建,你总是有updated_at的值,并可能永远只是排序的updated_at场。对于少量的重复,你可以简化你的代码,你的生活和sql查询的效率。