MS SQL Server意外行为



我认为我对SQL理解得很好,但这里有一个NULL值的简单例子,它引入了一个我没有想到的错误。有人能解释一下为什么第一个和第二个SELECT查询会产生不同的结果吗。

DROP TABLE IF EXISTS #temp;
CREATE TABLE #temp
(
ITEM int,
RELATIONSHIP nvarchar(max) NULL
)
INSERT INTO #temp VALUES (1, '')
INSERT INTO #temp VALUES (2, NULL)
INSERT INTO #temp VALUES (3, 'Parent')
INSERT INTO #temp VALUES (4, 'Child')

SELECT 
ITEM, RELATIONSHIP, 
CAST(CASE 
WHEN (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child') 
THEN 0 
ELSE 1 
END AS bit) family 
FROM 
#temp;
SELECT 
ITEM, RELATIONSHIP, 
CAST(CASE 
WHEN (RELATIONSHIP = 'Parent' OR RELATIONSHIP = 'Child') 
THEN 1 
ELSE 0 
END AS bit) family 
FROM 
#temp;
SELECT 
ITEM, RELATIONSHIP, 
CAST(CASE 
WHEN (RELATIONSHIP IS NULL OR (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child')) 
THEN 0 
ELSE 1 
END AS bit) family 
FROM 
#temp;
ITEM    RELATIONSHIP    family
1                       0
2       NULL            1
3       Parent          1
4       Child           1
ITEM    RELATIONSHIP    family
1                       0
2       NULL            0
3       Parent          1
4       Child           1
ITEM    RELATIONSHIP    family
1                       0
2       NULL            0
3       Parent          1
4       Child           1

这是因为NULL值的所有标量比较总是false,而(false and false(总是false吗?

如果我是正确的,那么结果只有第二行不同。对于第一个查询,条件WHEN (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child')对于NULLfalse,而对于第二个查询,对于NULL条件WHEN (RELATIONSHIP = 'Parent' OR RELATIONSHIP = 'Child')也是false

您必须使用IS NULL运算符在sql server中显式处理NULL。我认为您在第一个查询结果中存在混淆。因此,在您的第一个查询中,条件应该是

WHEN (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child') OR RELATIONSHIP IS NULL

SQL此处

与具有任何值(包括NULL(的NULL进行比较会产生UNKONWN,在二进制逻辑中将其转换为false

因此x = NULLUNKONWN(假(,x != NULL也是UNKONWN(假(。(类似地,x < NULLx <= NULLx > NULLx >= NULL等也将产生UNKONWN(。

CCD_ 22也是CCD_ 23(假(。

唯一的例外是通过IS NULLNULL进行测试。

ITEM    RELATIONSHIP    family    RELATIONSHIP = 'Parent'   RELATIONSHIP != 'Parent'
1                       0         false                     true
2       NULL            1         UNKONWN (false)           UNKONWN (false)
3       Parent          1         true                      false
4       Child           1         false                     true

相关内容

  • 没有找到相关文章

最新更新