在 t-SQL 中将值与 NULL 进行比较

问题描述 投票:0回答:6

我很好奇在 t-SQL 中将 NULL 与值进行比较是否合法?

例如,如果我有:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130

在这种情况下,WHERE 子句总是被评估为 FALSE。这是我可以依靠的吗?

sql sql-server t-sql null
6个回答
9
投票

不能将 NULL 与任何其他值进行比较,这会导致

'UNKNOWN'

来自msdn来源

NULL 值表示该值未知。值为 NULL 与空值或零值不同。没有两个空值 平等的。两个空值之间或 NULL 与任何值之间的比较 其他值,返回未知,因为每个 NULL 的值都是未知的。


3
投票

T-Sql 中所有值为空的布尔运算都会返回“UNKNOWN”,在子句中会被识别为 false。当你想设置一些默认值时,可以使用 ISNULL 函数。 例如你的情况:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE isnull(ctx.n1,0) < 130

2
投票

这取决于 ANSI_NULLS 的值。

http://msdn.microsoft.com/en-us/library/ms191270%28v=sql.90%29.aspx

当 SET ANSI_NULLS 为 ON 时,比较中的一个或多个 表达式为 NULL 不会产生 TRUE 或 FALSE;它产生 未知。

Transact-SQL 支持允许比较的扩展 与空值进行比较时,运算符返回 TRUE 或 FALSE。 通过将 ANSI_NULLS 设置为 OFF 来激活此选项。当 ANSI_NULLS 为 OFF,当 ColumnA = NULL 等比较时返回 TRUE 当 ColumnA 包含某个值时包含 null 值和 FALSE 除了 NULL 之外。


0
投票

下面

=
中的WHERE子句也是FALSE。你需要非常小心 NULL

WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
) 
SELECT *
FROM ctx 
WHERE ctx.n1 = NULL

0
投票

我一直使用 EXISTS 关键字和 EXCEPT 像这样

SELECT 1
WHERE EXISTS ((SELECT 1) EXCEPT (SELECT NULL))

0
投票

正如您在 this 答案中看到的,从 SQL Server 2022 开始,您可以使用

IS DISTINCT FROM
子句,该子句将始终返回
True
False
值。

© www.soinside.com 2019 - 2024. All rights reserved.