简体   繁体   English

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

[英]Comparing a value to a NULL in t-SQL

I was curious if it's legal in t-SQL to compare a NULL to a value?我很好奇在 t-SQL 中将 NULL 与值进行比较是否合法?

For instance, if I have:例如,如果我有:

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

the WHERE clause in that case is always evaluated as FALSE.在这种情况下,WHERE 子句总是被评估为 FALSE。 Is it something I can rely on?这是我可以依赖的东西吗?

You can't compare NULL with any other value, it will result in 'UNKNOWN' .您不能将 NULL 与任何其他值进行比较,它会导致'UNKNOWN'

From msdn source来自msdn 源

A value of NULL indicates that the value is unknown. NULL 值表示该值未知。 A value of NULL is different from an empty or zero value. NULL 值不同于空值或零值。 No two null values are equal.没有两个空值是相等的。 Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。

All boolean operations in T-Sql with null value returns 'UNKNOWN', which is recognized as false in clauses. T-Sql 中所有具有空值的布尔运算都返回“UNKNOWN”,这在子句中被识别为 false。 You can use ISNULL function when you want set some default value.当你想设置一些默认值时,你可以使用 ISNULL 函数。 for example in your case:例如在你的情况下:

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

It depends on the value of ANSI_NULLS.这取决于 ANSI_NULLS 的值。

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

When SET ANSI_NULLS is ON, a comparison in which one or more of the expressions is NULL does not yield either TRUE or FALSE;当 SET ANSI_NULLS 为 ON 时,一个或多个表达式为 NULL 的比较不会产生 TRUE 或 FALSE; it yields UNKNOWN.它产生未知。

Transact-SQL supports an extension that allows for the comparison operators to return TRUE or FALSE when comparing against null values. Transact-SQL 支持允许比较运算符在与空值进行比较时返回 TRUE 或 FALSE 的扩展。 This option is activated by setting ANSI_NULLS OFF.此选项通过将 ANSI_NULLS 设置为 OFF 来激活。 When ANSI_NULLS is OFF, comparisons such as ColumnA = NULL return TRUE when ColumnA contains a null value and FALSE when ColumnA contains some value besides NULL.当 ANSI_NULLS 为 OFF 时,当 ColumnA 包含空值时,诸如 ColumnA = NULL 之类的比较返回 TRUE,当 ColumnA 包含除 NULL 之外的其他值时返回 FALSE。

The WHERE clause in the following = is also FALSE.以下=的 WHERE 子句也是 FALSE。 You need to be very careful with NULLs你需要对 NULL 非常小心

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

I've always used the EXISTS keyword along with EXCEPT like so我一直使用 EXISTS 关键字和 EXCEPT 一样

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM