SQLServer2022新特性IS [NOT] DISTINCT FROM

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 的行。
  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值