【问题标题】:My CASE statement is not returning what I need我的 CASE 语句没有返回我需要的东西
【发布时间】:2018-10-30 03:10:31
【问题描述】:

我有一个表格,其中我们有额外的日期列供操作人员用来定义租约的结束,但我试图运行的案例语句没有返回我需要的日期。

下面是我的桌子:

extra_date_08 | extra_date_07  | extra_date_06 | extra_date_05 | Tency_st_dt
--------------+----------------+---------------+---------------+------------
NULL          | NULL           | NULL          | NULL          | 2013-11-30
NULL          | NULL           | NULL          | 2023-04-29    | 2013-04-27
NULL          | NULL           | NULL          | 2023-04-10    | 2013-04-09

我需要的是结果按大小写的顺序返回结束日期,如果 null 移动到下一个 when 部分直到它用完否则它应该将结束日期定义为 else子句:

End Date   | 
------------
2018-11-30 | 
2023-04-29 | 
2023-04-10 |



SELECT  
    CASE 
        WHEN h.extra_date_08 <> NULL 
            THEN h.extra_date_08
        WHEN h.extra_date_07 <> NULL 
            THEN h.extra_date_07
        WHEN h.extra_date_06 <> NULL 
           THEN h.extra_date_06
        WHEN h.extra_date_05 <> NULL 
           THEN h.extra_date_05
        ELSE DATEADD(yyyy,5,CAST(A.tency_st_dt AS DATE)) 
    END 'End Date',

【问题讨论】:

  • 其他答案都是正确的。只是为了获得更多信息,您的查询不起作用的原因是大多数 DBMS 支持三值逻辑 - {True、False 和 Unknown}。由于 NULL 表示没有数据,因此这些值是 Unknown 而不是 True 或 False。例如,如果我不知道自己的年龄,则为 NULL。所以“MyAge 30”这句话不是真或假。我可能30岁,我可能不会。这就是您需要 IS NULL 运算符的原因。
  • @Error_2646,这实际上是问题的答案。其他只是更正的代码。如果你发布了,我会赞成。
  • Case expression - 因为它返回一个值。 (case语句没有返回值,只是代码的条件执行。)

标签: sql


【解决方案1】:

使用is not null 代替&lt;&gt;

SELECT  
CASE 
    WHEN h.extra_date_08 is not NULL 
        THEN h.extra_date_08
    WHEN h.extra_date_07 is not NULL 
        THEN h.extra_date_07
    WHEN h.extra_date_06 is not NULL 
        THEN h.extra_date_06
    WHEN h.extra_date_05 is not NULL 
        THEN h.extra_date_05
            ELSE DATEADD(yyyy,5,CAST(A.tency_st_dt AS DATE)) 
END 'End Date',

【讨论】:

    【解决方案2】:

    我想你想要coalesce():

    SELECT COALESCE(h.extra_date_08, h.extra_date_07, h.extra_date_06, h.extra_date_05,
                    DATEADD(year, 5, CAST(A.tency_st_dt AS DATE))
                   ) as EndDate
    

    【讨论】:

      【解决方案3】:

      特殊值 NULL 代表一个 unknown 值,因此您不能直接将任何实际值与其进行比较。由于 NULL 表示未知,因此与它的任何比较都将始终评估为 false:

      @your_var = NULL // => False
      @your_var <> NULL // => False
      

      无论 @your_var 的值如何。

      这就是为什么您的 CASE 表达式总是到达 ELSE 部分的原因。

      正如@Zaynul Abadin Tuhin 所指出的,要检查 NULL,您应该改用 IS NULL operator。 @Gordon Linoff 建议的 COALESCE 函数实际上只是一个 syntactic sugar ,它被转换为下面的前一个表达式,但它确实让你的代码更干净、更好。

      更多关于与您类似的常见场景here

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 2021-04-07
        • 2019-04-16
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 2012-04-03
        • 2019-09-03
        相关资源
        最近更新 更多