我理解 null
表示缺失值/未知值,因此 null
不等于另一个 null
因为两个未知事物无法比较。例如
if null = null
select 'nulls are equal'
else
select 'nulls are not equal'
'nulls are not equal'
中的结果我使用了 =
而不是 is null
或 is not null
在此强调两个 null 不能进行比较这一事实。
来到UNION
,UNION
应该消除重复值。我期望下面的代码返回两行,每行都带有 null
,因为两个 null
值不相等,但我在结果集中只得到一个 null。
(select null as Col1)
union
(select null as Col1)
为什么 SQL 对“null as an unknown value”的解释在上述两个语句中发生了变化?
最佳答案
NULL没有可比性,但SQL一般确实有“IS DISTINCT FROM”的概念
SQL Server 有一个 Connect它的项目
1
与NULL
不同 = true1 = null
为假
为了完整性,NULL
与 NULL
= false
我猜测 DISTINCT 和 UNION 使用 IS DISTINCT FROM
(如上面提到的 Pரதீப்)
现在,SQL Server 确实在 INTERSECT 和 EXCEPT 中有 IS DISTINCT FROM
DECLARE @t1 TABLE (t1col INT);
INSERT @t1 VALUES (1), (NULL), (2), (3), (3), (5), (5);
DECLARE @t2 TABLE (t2col INT);
INSERT @t2 VALUES (1), (NULL), (3), (4);
SELECT DISTINCT 't1 EXISTS t2', *
FROM @t1 t1 WHERE EXISTS (SELECT * FROM @t2 t2 WHERE t1.t1col = t2.t2col);
t1 EXISTS t2 1
t1 EXISTS t2 3
t1 EXISTS t2 3
SELECT DISTINCT 't1 INTERSECT t2', *
FROM @t1 INTERSECT SELECT 't1 INTERSECT t2', * FROM @t2;
t1 INTERSECT t2 NULL
t1 INTERSECT t2 1
t1 INTERSECT t2 3
INTERSECT 和 EXCEPT 也删除重复项,因为它们进行半连接
EXISTS 是一个反加入 BTW
为了完整性
SELECT 't1 EXISTS t2', *
FROM @t1 t1 WHERE NOT EXISTS (SELECT * FROM @t2 t2 WHERE t1.t1col = t2.t2col);
t1 EXISTS t2 NULL
t1 EXISTS t2 2
t1 EXISTS t2 5
t1 EXISTS t2 5
SELECT 't1 EXCEPT t2', *
FROM @t1 EXCEPT SELECT 't1 EXCEPT t2', * FROM @t2;
t1 EXCEPT t2 2
t1 EXCEPT t2 5
示例取 self 的回答 Why does EXCEPT exist in T-SQL?添加了 NULL
关于sql-server - 为什么 UNION 只返回一个 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45376391/