sql-server - 为什么 UNION 只返回一个 null?

标签 sql-server tsql null

我理解 null 表示缺失值/未知值,因此 null 不等于另一个 null 因为两个未知事物无法比较。例如

if null = null
    select 'nulls are equal'
else
    select 'nulls are not equal'

'nulls are not equal' 中的结果我使用了 = 而不是 is nullis not null 在此强调两个 null 不能进行比较这一事实。

来到UNIONUNION 应该消除重复值。我期望下面的代码返回两行,每行都带有 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它的项目

  • 1NULL 不同 = true
  • 1 = null 为假

为了完整性,NULLNULL = 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/

相关文章:

sql-server - View 别名上的 WHERE 导致错误

postgresql - TSQL "go"语句对应的 PostgreSQL 是什么?

java - Hibernate,替换hql中的空值

Java 构造函数样式 : check parameters aren't null

c# - 如何使用 C# 计算哈希字节 SHA1?

sql-server - sql 本地 (#) 临时表 - 从其他连接读取数据

sql-server - SQL Server 2008 不显示默认实例名称

sql - Sql Server 中的计算

objective-c - 什么时候应该在 Objective-C 中使用 nil 和 NULL?

sql - 撤消对 SQL Server 2005 数据库的更改