我有一个表,其中有一些额外的日期列供操作员用来定义租约的结束时间,但是我要运行的案例声明没有返回我需要的日期。
我的下表:
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',
答案 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类似的常见情况的更多信息。