Y为空且Z为空时显示X.

时间:2016-08-22 21:46:31

标签: sql database relational-database

我想显示某些日期,如果其他人回来为空... 我尝试了什么

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,但是当我这样做时,我会为同一个人显示多个记录,显示不为空的各种日期..

3 个答案:

答案 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的结果。