【问题标题】:Set two different values/results with CASE使用 CASE 设置两个不同的值/结果
【发布时间】:2018-11-02 16:32:13
【问题描述】:

我在一个更大的查询中有这两个 CASE 语句 -

CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END DNR2017,
CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2018' THEN 'YES' ELSE 'NO' END DNR2018

我遇到的问题是,如果它等于 2017,那么 DNR2017 和 DNR2018 都需要设置为“YES”。就像现在一样,在日期为 2017 年的情况下,它将 DNR2017 设置为 YES,但将 DNR2018 设置为 NO。有办法处理吗?

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    根据你的逻辑,我会使用TO_NUMBER 函数。

    (CASE WHEN TO_NUMBER(to_char(tm.DNRDATE,'YYYY')) <= 2017 THEN 'YES' ELSE 'NO' END) as DNR2017,
    (CASE WHEN TO_NUMBER(to_char(tm.DNRDATE,'YYYY')) <= 2018 THEN 'YES' ELSE 'NO' END) as DNR2018
    

    编辑

    感谢@Alex Poole 指出您还可以使用extract 获取年份编号。

    (CASE WHEN extract(year from tm.DNRDATE) = 2017 THEN 'YES' ELSE 'NO' END) as DNR2017,
    (CASE WHEN extract(year from tm.DNRDATE) BETWEEN 2017 AND 2018 THEN 'YES' ELSE 'NO' END) as DNR2018
    

    【讨论】:

    • 虽然 Gordon 的答案有效,但我更喜欢这个答案,因为我从中提取数据的表中也可能添加了 2016 年的数据,这在所有情况下都涵盖了我。谢谢。
    • 这也将匹配 2016 年及之前的数据;不清楚这是否可取...(您也可以extract(year from tm.DNRDATE),我认为这更清楚一点,但是YMMV...)
    • @AlexPoole 谢谢extract 会比TO_NUMBER 更优雅
    【解决方案2】:

    你可以使用in:

    (CASE WHEN to_char(tm.DNRDATE,'YYYY') = '2017' THEN 'YES' ELSE 'NO' END) as DNR2017,
    (CASE WHEN to_char(tm.DNRDATE,'YYYY') IN ('2017', '2018') THEN 'YES' ELSE 'NO' END) as DNR2018
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2016-12-08
      • 2015-07-26
      相关资源
      最近更新 更多