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

CASE expression for NULL condition is not working

我有一个 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;

您可以使用 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表达式只会return一种类型。因此,您应该检查代码或进行必要的对话。

你可以使用 isnull

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;

问题是 NULL 比较。比较永远不会为真,即使在 CASE 表达式中使用比较也是如此。

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

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

如果你想 return 在这种情况下的原始值,你需要一个 ELSE:

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

请注意,如果该列确实是 DATE,这将 return 出错,因为 '12345678' 无法转换为日期。

这个版本用COALESCE()表示更好:

COALESCE(td.originalLinearAirDate, '12345678')