我认为我对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')
对于NULL
是false
,而对于第二个查询,对于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 = NULL
是UNKONWN
(假(,x != NULL
也是UNKONWN
(假(。(类似地,x < NULL
、x <= NULL
、x > NULL
、x >= NULL
等也将产生UNKONWN
(。
CCD_ 22也是CCD_ 23(假(。
唯一的例外是通过IS NULL
对NULL
进行测试。
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