所以我有一个简单的查询,返回产品列表
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
在联机丛书上查看完整参考资料- 默认情况下,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'