2012-03-12 51 views
9

我有一个三列的表;第一列包含ID,另外两列包含日期(最多一个为空,但我认为这不会影响任何内容)。我怎么去订购基于哪个日期更大的ID?我试过由两个不同的(可能为空)列的SQL顺序

ORDER BY CASE 
WHEN date1 > date2 THEN date1 
ELSE date2 
END 

但是这没有奏效。谁能帮我?另外,我见过其他人发布的所有类似问题都有它,以便查询根据第一列排序结果,然后如果第一列为空(第二列)。我首先必须定义每个空值吗?我通过一个完整的外连接创建这个表,所以这将是一个完全不同的问题,所以希望可以用空值完成。

+1

你的'CASE'表达式对我来说看起来很好,除了它不支持'date2'为空的情况;为了支持这一点,你还想编写(说)'ORDER BY CASE WHEN date1> date2 OR date2 IS NULL THEN date1 ELSE date2 END'。但是你说它“不起作用”。你可以说得更详细点吗?例如,您可以发布无法正确排序的实际数据吗? – ruakh 2012-03-12 02:18:15

+0

Gabe,什么数据库将运行查询? – 2012-03-12 02:19:53

+0

对不起,我以为他们都是一样的。但我正在使用Oracle。我不知道这对你们来说是否足够具体。 :S – 2012-03-12 02:26:17

回答

15

我相信你的问题是涉及到比较时要么列为NULL失败。所以,你可能需要:

ORDER BY CASE 
      WHEN date1 IS NULL THEN date2 
      WHEN date2 IS NULL THEN date1 
      WHEN date1 > date2 THEN date1 
      ELSE     date2 
      END 
+0

这样做了,谢谢! :d – 2012-03-12 02:24:53

-1

的Try ...

SELECT MAX(date1,date2) date FROM table ORDER BY date; 
+0

是的,但是你不能以标准SQL的方式将它加入到date1!= null上,然后在date2!= null再次加入表,但同时给出具有未定义行为的ALIAS。 – DanRedux 2012-03-12 02:19:31

+0

(我删除了我以前的评论,用一个更清晰的评论替换它们。)我不认为任何DBMS都支持使用MAX。也许你正在想'最好'?但无论如何,真的不需要这种方法。这些表达式可以放在'ORDER BY'子句中。 – ruakh 2012-03-12 02:25:53

+0

他们可以,但它是别名,因为它自己的列允许日期也可以检索。额外的免费功能。 – DanRedux 2012-03-12 02:27:49