小编典典

where子句中的SQL和NULL值

sql

所以我有一个简单的查询,返回产品列表

SELECT     Model, CategoryID
FROM         Products
WHERE     (Model = '010-00749-01')

这返回

010-00749-01    00000000-0000-0000-0000-000000000000
010-00749-01    NULL

正确,所以我只需要CategoryID不是‘00000000-0000-0000-0000-0000-000000000000’的产品,所以我有

SELECT     Model, CategoryID
FROM         Products
WHERE     (Model = '010-00749-01') 
AND (CategoryID <> '00000000-0000-0000-0000-000000000000')

但这不会返回任何结果。所以我将查询更改为

SELECT     Model, CategoryID
FROM         Products
WHERE     (Model = '010-00749-01') 
AND ((CategoryID <> '00000000-0000-0000-0000-000000000000') OR  (CategoryID  IS NULL))

哪个返回预期结果

010-00749-01    NULL

有人可以向我解释这种行为吗?MS SQL Server发行日为2008


阅读 179

收藏
2021-04-22

共1个答案

小编典典

联机丛书上查看完整参考资料-
默认情况下,ANSI_NULLS处于启用状态,这意味着您需要使用已完成的方法。否则,您可以在查询开始时将该设置切换为“关闭”,以轮换进行该行为。

当SET ANSI_NULLS为ON时,即使column_name中有空值,使用WHERE column_name =
NULL的SELECT语句也将返回零行。即使column_name中包含非空值,使用WHERE column_name <>
NULL的SELECT语句也将返回零行。

当SET ANSI_NULLS为ON时,对空值的所有比较均评估为UNKNOWN。当SET
ANSI_NULLS为OFF时,如果数据值为NULL,则将所有数据与null值的比较评估为TRUE。

这是一个简单的示例,用于演示与NULL比较有关的行为:

-- This will print TRUE
SET ANSI_NULLS OFF;
IF NULL <> 'A'
    PRINT 'TRUE'
ELSE
    PRINT 'FALSE'

-- This will print FALSE
SET ANSI_NULLS ON;
IF NULL <> 'A'
    PRINT 'TRUE'
ELSE
    PRINT 'FALSE'
2021-04-22