Sql 在CASE子句中测试NULL

Sql 在CASE子句中测试NULL,sql,case,Sql,Case,我不明白为什么这两个CASE语句在DATETIME值为NULL时提供不同的答案 DECLARE @MyDate DATETIME = NULL; SELECT CASE ISNULL(@MyDate, 0) WHEN 0 THEN 'It Is Null' ELSE 'It Is a Date' END; 这将导致值“ItisNull”,这很简单-将Null值转换为0,然后我们测试0。然而: DECLARE @MyDate DATETIME = NULL; SELECT C

我不明白为什么这两个CASE语句在DATETIME值为NULL时提供不同的答案

DECLARE @MyDate DATETIME = NULL;
SELECT CASE ISNULL(@MyDate, 0)
    WHEN 0 THEN 'It Is Null'
    ELSE 'It Is a Date'
  END;
这将导致值“ItisNull”,这很简单-将Null值转换为0,然后我们测试0。然而:

DECLARE @MyDate DATETIME = NULL;
SELECT CASE @MyDate
    WHEN NULL THEN 'It Is Null'
    ELSE 'It Is a Date'
  END;
上面的结果是“这是一个日期”,这是我的困惑点。该子句不接受“WHENISNULL”,这是我最初认为的问题


为什么不能在识别空值时使用CASE?

您使用的CASE表达式语法是将您在
CASE
部分中提供的值与提供的每个值以及
WHEN
部分进行比较(一旦找到匹配项,就会停止)。 因此,您在该语句中实际要求的是
@Date=NULL
——它的计算结果将始终为false。 你可以这样写:

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

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


语法只是略有不同,以获得正确的结果。

我不确定您使用的是什么RDBMS,但在T-SQL中,正确的(以及符合ANSI的总体)方法是:

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

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


您正在使用什么RDBMS?
DECLARE @MyDate DATETIME = NULL;
SELECT 'It Is Null'
 WHERE @MyDate IS NULL
UNION
SELECT 'It Is a Date'
 WHERE @MyDate IS NOT NULL;