在CASE子句中测试NULL

时间:2016-07-21 09:21:46

标签: sql case

当DATETIME值为NULL时,我很困惑为什么这两个CASE语句提供不同的答案。

DECLARE @MyDate DATETIME = NULL;
SELECT CASE ISNULL(@MyDate, 0)
    WHEN 0 THEN 'It Is Null'
    ELSE 'It Is a Date'
  END;

这导致值'It Is Null',这很简单 - 将NULL值变为0,然后我们测试0.但是:

DECLARE @MyDate DATETIME = NULL;
SELECT CASE @MyDate
    WHEN NULL THEN 'It Is Null'
    ELSE 'It Is a Date'
  END;

以上结果是'这是一个约会',这是我的困惑点。该条款不接受“WHEN IS NULL”,这是我首先想到的问题。

为什么CASE WHEN不会识别NULL值?

4 个答案:

答案 0 :(得分:0)

您正在使用的案例表达式语法是将您在case部分中提供的值与提供的每个值和when部分进行比较(并在找到匹配后停止)。 所以你在该陈述中实际要求的是@Date = NULL - 总是评估为假。 你可以这样写:

SELECT CASE WHEN @MyDate IS NULL 
THEN  'It Is Null'
ELSE  'It Is a date'
END

答案 1 :(得分:0)

很抱歉在我发布后找到了答案,就在这里:

T-SQL CASE Clause: How to specify WHEN NULL

语法与实现正确的结果略有不同。

答案 2 :(得分:0)

我不确定您使用的是哪种RDBMS,但在T-SQL中,正确的(以及符合ANSI标准的)整体方式是:

DECLARE @MyDate DATETIME = NULL;
SELECT 
  CASE
    WHEN @MyDate IS NULL 
    THEN 'It Is Null'
    ELSE 'It Is a Date'
  END;

答案 3 :(得分:0)

我最近做过的观察:人们对CASE表达式感到困惑,而使用UNION的等效构造很容易编写和理解(并且似乎更直观地处理空值! )例如

DECLARE @MyDate DATETIME = NULL;
SELECT 'It Is Null'
 WHERE @MyDate IS NULL
UNION
SELECT 'It Is a Date'
 WHERE @MyDate IS NOT NULL;