SQLServer2022新特性IS [NOT] DISTINCT FROM
1、本文内容
- 语法
- 参数
- 备注
- 示例
比较两个表达式的相等性,并保证一个 true 或 false 结果,即使一个或两个操作数均为 NULL。
IS [NOT] DISTINCT FROM 这一谓词用于 WHERE 子句和 HAVING 子句的搜索条件中,还用于 FROM子句的联接条件以及需要布尔值的其他构造中。
官方文档
https://learn.microsoft.com/zh-cn/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver16
[root@orcl23c opt]# sqlcmd -S localhost -U sa -C
Password:
1> select @@version;
2> go
--------------------------------------------------------------------------------------
Microsoft SQL Server 2022 (RTM-CU13) (KB5036432) - 16.0.4125.3 (X64)
May 1 2024 15:05:56
Copyright (C) 2022 Microsoft Corporation
Express Edition (64-bit) on Linux (CentOS Linux 8) <X64>
(1 rows affected)
2、语法
expression IS [NOT] DISTINCT FROM expression
3、参数
expression
任何有效的表达式。
该表达式可以是列、常量、函数、变量、标量子查询,或者是通过运算符或子查询连接的列名、常量和函数的任意组合。
4、备注
将 NULL 值与任何其他值(包括另一个 NULL)进行比较将产生未知结果。 IS [NOT] DISTINCT FROM 将始终返回 true 或 false,因为在用作比较运算符时,它将 NULL 值视为已知值。
以下示例表使用值 A 和 B 来说明 IS [NOT] DISTINCT FROM 的行为:
针对链接服务器执行包含 IS [NOT] DISTINCT FROM 的查询时,发送到链接服务器的查询文本将有所不同,具体取决于我们能否确定链接服务器有能力分析语法。
如果我们确定链接服务器可分析 IS [NOT] DISTINCT FROM,则将按原样解码语法。 如果无法确定链接服务器可否分析 IS [NOT] DISTINCT FROM,则将解码为以下表达式:
A IS DISTINCT FROM B 将解码为:((A <> B OR A IS NULL OR B IS NULL) AND NOT (A IS NULL AND B IS NULL))
A IS NOT DISTINCT FROM B 将解码为:(NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))
5、示例
5.1. 使用 IS DISTINCT FROM
以下示例返回 id 字段值与整数值 3不同的行。
CREATE TABLE t_sample01 (id INT, nameinfo nvarchar(64));
INSERT INTO t_sample01 VALUES (1, 'hello sqlserver 200') ;
INSERT INTO t_sample01 VALUES (2, null);
INSERT INTO t_sample01 VALUES (3, 'SQLServer Management Studio');
INSERT INTO t_sample01 VALUES (3, 'yes');
INSERT INTO t_sample01 VALUES (null, null);
GO
SELECT * FROM t_sample01 WHERE id IS DISTINCT FROM 3;
id nameinfo
----------- ----------------------------------------------------------------
1 hello sqlserver 200
2 NULL
NULL NULL
-- 结果排除了 id字段值 与值 3 匹配的所有行。
5.2. 使用 IS NOT DISTINCT FROM
以下示例返回 id 字段值与整数值 3 相同的行。
SELECT * FROM t_sample01 WHERE id IS NOT DISTINCT FROM 3;
id nameinfo
----------- ----------------------------------------------------------------
3 SQLServer Management Studio
3 yes
5.3. 针对 NULL 值使用 IS DISTINCT FROM
以下示例返回 id 字段值与 NULL 不同的行。
SELECT * FROM t_sample01 WHERE id IS DISTINCT FROM NULL;
id nameinfo
----------- ----------------------------------------------------------------
1 hello sqlserver 2022
2 NULL
3 SQLServer Management Studio
3 yes
(4 rows affected)
-- 结果仅返回 id 字段值 不是 NULL 的行。
5.4 . 针对 NULL 值使用 IS NOT DISTINCT FROM
以下示例返回 id 字段值与 NULL 相同的行。
SELECT * FROM t_sample01 WHERE id IS NOT DISTINCT FROM NULL;
id nameinfo
----------- ----------------------------------------------------------------
NULL NULL
(1 rows affected)
-- 结果仅返回 id字段值 是 NULL 的行。