我有一个表有一列值可以是rowTypeID =(1,2,3或null).我想编写一个查询,返回任何没有值为3的行.在这个例子中,我想要所有NULL行以及所有1,2行,我只是不想要值为3的行
当前为数据库设置了ANSI null ON.
我很好奇为什么我不能写
select * from myTable where myCol <> 3
Run Code Online (Sandbox Code Playgroud)
此查询不会返回myCol列中具有NULL的任何行
我得写
select * from my Table where myCol <> 3 or myCol Is NULL
Run Code Online (Sandbox Code Playgroud)
我是否总是必须包含IS NULL或者我可以设置它以使where子句myCol <> 3将返回具有Null作为我的Col的值的行
所以我有一个简单的查询返回产品列表
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
Run Code Online (Sandbox Code Playgroud)
这回来了
010-00749-01 00000000-0000-0000-0000-000000000000
010-00749-01 NULL
Run Code Online (Sandbox Code Playgroud)
这是正确的,所以我只想要那些CategoryID不是'00000000-0000-0000-0000-000000000000'的产品,所以我有
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
AND (CategoryID <> '00000000-0000-0000-0000-000000000000')
Run Code Online (Sandbox Code Playgroud)
但这没有结果.所以我将查询更改为
SELECT Model, CategoryID
FROM Products
WHERE (Model = '010-00749-01')
AND ((CategoryID <> '00000000-0000-0000-0000-000000000000') OR (CategoryID IS NULL))
Run Code Online (Sandbox Code Playgroud)
哪个返回预期结果
010-00749-01 NULL
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这种行为吗?MS SQL Server 2008