这意味着在第一个示例中使用@region
isNULL
时,即使表中Region
is所在的行也不会返回if的行NULL
。
当ANSI_NULLS
on时(无论如何,您都应该始终设置为on,因为将来将不启用它的选项将被删除),(至少)操作数之一为的任何比较操作都会NULL
产生第三个逻辑值- UNKNOWN
(相对于TRUE
和FALSE
)。
UNKNOWN
如果尚未确定(例如AND
,使用FALSE
操作数或OR
使用TRUE
操作数)或取反(NOT
),则值会通过任何组合的布尔运算符传播。
该WHERE
子句用于过滤该子句产生的结果集,以使该FROM
子句的总值WHERE
必须是TRUE
不被滤除的行。因此,如果UNKNOWN
通过任何比较产生an ,则将导致该行被过滤掉。
@ user1227804的答案包含以下引用:
如果比较的两面都是列或复合表达式,则该设置不会影响比较。
来自*SET ANSI_NULLS
但是,我不确定它要说明什么,因为如果NULL
比较了两列(例如JOIN
),则比较仍然失败:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
上面的查询返回0行,而:
select * from
返回一行。因此,即使两个操作数都是列,NULL
也不等于NULL
。并且文档=
中没有关于操作数的任何内容:
比较两个NULL
表达式时,结果取决于ANSI_NULLS
设置:
如果ANSI_NULLS
将设置为ON
,则结果为NULL
1,遵循ANSI约定NULL
(一个(或未知)值不等于另一个NULL
或未知值)。
如果ANSI_NULLS
设置为OFF
,结果NULL
比NULL
是TRUE
。
与NULL
非NULL
值进行比较总是得出FALSE
2。
但是,1和2都不正确-两次比较的结果均为UNKNOWN
。
*多年后终于发现了本文的神秘含义。实际上,对于这些比较而言,该设置没有任何作用,并且始终像该设置为ON一样起作用。如果它说那SET ANSI_NULLS OFF
是没有影响的设置,本来会更清楚。