我的CASE语句未返回我所需要的

时间:2018-10-29 17:07:55

标签: sql

我有一个表,其中有一些额外的日期列供操作员用来定义租约的结束时间,但是我要运行的案例声明没有返回我需要的日期。

我的下表:

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',

3 个答案:

答案 0 :(得分:3)

使用unsafe代替is not null

<>

答案 1 :(得分:1)

我认为您想要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

答案 2 :(得分:0)

特殊值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类似的常见情况的更多信息。