【问题标题】:SQL order by two different (possibly null) columns按两个不同(可能为空)列的 SQL 顺序
【发布时间】:2012-03-12 02:11:35
【问题描述】:

我有一个三列的表;第一列包含 ID,另外两列包含日期(最多一个为空,但我认为这不会影响任何事情)。我将如何根据哪个日期较大来订购 ​​ID?我试过了

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

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

【问题讨论】:

  • 您的CASE 表达式对我来说看起来不错,只是它不支持date2 为空的情况;为了支持这一点,你想写(比如)ORDER BY CASE WHEN date1 > date2 OR date2 IS NULL THEN date1 ELSE date2 END。但是你说它“没有用”。你可以说得更详细点吗?例如,您可以发布无法正确排序的实际数据吗?
  • Gabe,哪个数据库将运行查询?
  • 很抱歉,我以为它们的工作方式都一样。但我使用的是甲骨文。我不知道这对你们来说是否足够具体。 :S
  • 但问题似乎在于空值正在做他们不应该做的事情。我认为 null 值被忽略了,除了在聚合中,但似乎我读错了我的笔记。 :S

标签: sql sql-order-by


【解决方案1】:

我相信您的问题与任一列为 NULL 时比较失败有关。所以,你可能需要:

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

【讨论】:

    【解决方案2】:

    试试……

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

    【讨论】:

    • 是的,但是你不能在标准 SQL 中真正做到这一点,除非在 date1 != null 上以某种方式将表连接到自身上,然后在 date2 != null 上再次加入,但同时给出相同的 ALIAS有未定义的行为。
    • (我已经删除了我之前的 cmets,用更清晰的替换它们。)我认为没有任何 DBMS 支持使用 MAX;也许你在想GREATEST?但无论如何,这种方法真的没有必要。这些表达式可以放在ORDER BY 子句中就好了。
    • 他们可以,但是将其别名为它自己的列允许也检索日期。额外的免费功能。
    • -1,对不起。您正在为一个没有做 OP 想要做的事情并且做 OP 没有要求做的事情的损坏查询提供荒谬的理由。如果你不知道如何做某事,你真的不需要只是想出一个答案。
    • 你说得对,我的意思是最棒的。然而,知道选择的日期可能是他的下一个问题。
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多