【问题标题】:Empty select result when dates are used使用日期时为空选择结果
【发布时间】:2012-03-12 16:44:05
【问题描述】:

初始数据:有一段查询,为了推理可以简化为下一段

SELECT MAX((CASE 
          WHEN to_char(sysdate, 'DY') = 'SAT' THEN 1 
          WHEN to_char(sysdate, 'DY') = 'SUN' THEN 1
          ELSE 0 END)) status 
FROM mytable WHERE mycondition;

问题: 似乎如果 mycondition 导致空结果集的前两个条件不能正常工作并返回 null 而不是 1。如果我只是替换查询的最后一行下一个

FROM dual;

前两个条件完美无缺。

条件:应该只是一个查询,没有ifs、var defs等。

如何执行这种类型的选择但不返回空值?

P.S.:可以使用 NVL/NVL2 但这确实使事情变得复杂。

提前致谢。

【问题讨论】:

  • 您的查询没有从 mytable 返回任何字段。为什么要包含它?
  • @Olaf,我在那里写了 if,这意味着在某些情况下确实如此。
  • 您的复制品可能与原始版本不同,因为在我的情况下它失败了。

标签: plsql oracle10g resultset


【解决方案1】:

使用 NVL 函数:

SELECT NVL(MAX((CASE 
          WHEN to_char(sysdate, 'DY') = 'SAT' THEN 1 
          WHEN to_char(sysdate, 'DY') = 'SUN' THEN 1
          ELSE 0 END)), 1) status 
FROM mytable WHERE mycondition;

【讨论】:

    【解决方案2】:

    CASE WHEN 工作正常,你的问题在于 MAX。

    当没有行匹配时,MAX 和 MIN 返回 null,而 SUM 和 COUNT 返回 0。

    恐怕 den-javamaniac 是对的,您需要 NVL,或者如果您无法切换 MAX,则可能需要巧妙地使用 DECODE。

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2016-07-02
      • 2021-07-28
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多