NULL条件的CASE表达式不起作用

时间:2019-03-28 13:52:20

标签: sql case sqlanywhere

我有一个SQL查询,其中case表达式不起作用,因为我得到了NULL值。

有什么解决方法吗?

select 
td.reportEndDate,
    CASE td.originalLinearAirDate
    WHEN NULL THEN '12345678'
    END As originalLinearAirDate
from 
FROM DBA.Telecast td 
where id = 2
order by
td.reportEndDate,
originalLinearAirDate;

3 个答案:

答案 0 :(得分:0)

您可以使用COALESCE()

SELECT td.reportEndDate, 
       COALESCE(td.originalLinearAirDate, '12345678') AS originalLinearAirDate -- Use default date instead of '12345678'
FROM DBA.Telecast td 
WHERE id = 2
ORDER BY td.reportEndDate, originalLinearAirDate;

在您的case表达式中,您没有指定ELSE部分,因此得到了NULL

但是,case表达式将仅返回一种类型。因此,您应该检查代码或进行必要的对话。

答案 1 :(得分:0)

您可以使用isull

select 
td.reportEndDate,
    CASE WHEN td.originalLinearAirDate IS NULL THEN '19000101'
         ELSE td.originalLinearAirDate 
    END As originalLinearAirDate
from 
FROM DBA.Telecast td 
where id = 2
order by
td.reportEndDate,
originalLinearAirDate;

答案 2 :(得分:0)

问题是NULL比较。即使从CASE表达式中比较使用,该比较也永远不会成立。

如果您想使用CASE进行此操作,则需要使用IS NULL

(CASE WHEN td.originalLinearAirDate IS NULL
      THEN '12345678'
 END) As originalLinearAirDate

如果要在这种情况下返回原始值,则需要ELSE

(CASE WHEN td.originalLinearAirDate IS NULL
      THEN '12345678'
      ELSE td.originalLinearAirDate 
 END) As originalLinearAirDate

请注意,如果该列实际上是DATE,则将返回错误,因为'12345678'无法转换为日期。

最好使用COALESCE()来表示此版本:

COALESCE(td.originalLinearAirDate, '12345678')