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

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

最佳答案

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



这是一个简单的示例,用于演示与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'

10-06 05:00