Sql 在CASE子句中测试NULL
我不明白为什么这两个CASE语句在DATETIME值为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
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;