我想显示某些日期,如果其他人回来为空... 我尝试了什么
case
when attv4.valueDateTime IS NOT NULL then attv4.valueDateTime
when attv4.valueDateTime IS NULL then attv5.valueDateTime
when (attv5.valueDateTime IS NULL AND attv4.valueDateTime IS NULL) then bpc.consentDate
when (bpc.consentDate IS NULL AND attv4.valueDateTime IS NULL AND attv5.valueDateTime IS NULL) then col.collectDate
end
我也尝试使用多个ISNULL,但是当我这样做时,我会为同一个人显示多个记录,显示不为空的各种日期..
答案 0 :(得分:1)
我喜欢coalesce()
。它准确捕获您想要的内容:优先级排序值列表中的第一个非空值。
但是,如果您想使用CASE
表达式,那么,正如您尝试的那样,那将是这样的:
case
when attv4.valueDateTime IS NOT NULL then attv4.valueDateTime
when attv5.valueDateTime IS NOT NULL then attv5.valueDateTime
when bpc.consentDate IS NOT NULL then bpc.consentDate
else col.collectDate
end
特别注意,只有当前面的所有条件都被评估为假时,才会考虑每个连续的when
条件;你不需要重复每个连续谓词中所有这些条件的否定。
答案 1 :(得分:0)
您可以像这样链接isnull
来电:
isnull(attv4.valueDateTime,
isnull(attv5.valueDateTime,
isnull(bpc.consentDate, col.collectDate)))
答案 2 :(得分:0)
sgeddes提出了一个很好的观点,COALESCE()https://msdn.microsoft.com/en-us/library/ms190349.aspx在这里很有用,你根本不需要你的案例陈述。
COALESCE(attv4.valueDateTime, attv5.ValueDateTime, bpc.consentDate, col.collectdate)
在case语句中,返回第一个TRUE语句。所以你可以像这样编写语句,它会自动考虑1值为null然后是下一个等等。
CASE
WHEN attv4.ValueDateTime IS NOT NULL THEN attv4.ValueDateTime
WHEN attv5.ValueDateTime IS NOT NULL THEN attv4.ValueDateTime
WHEN bpc.ConsentDate IS NOT NULL THEN bpc.ConsentDate
ELSE col.collectDate
END
正如@dnoeth所指出的那样,我认为我们都读过去太快了,因为你的前两个条件总会得到满足所以因为attv4.ValueDateTime是NULL或NOT NULL。如果NOT NULL,你获得的值将是attv4.ValueDateTime,如果为NULL,你将得到attv5.valueDateTime,但你永远不会得到bpc.consentDate或col.collectDate .....
但是,如果您获得每人多条记录,则可能更多是由于JOINS而非案例陈述。您可以查看调用DISTINCT并删除未使用的列,或使用ROW_NUMBER()并选择其中= 1的结果。