SQL Server将不等于<>的行返回到值并且为NULL

peh*_*ada 19 sql-server null

我有一个表有一列值可以是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的值的行

Mar*_*ers 16

我认为你的方法很好:

SELECT *
FROM MyTable
WHERE myCol <> 3 OR myCol IS NULL
Run Code Online (Sandbox Code Playgroud)

由于您要求替代方法,另一种方法是创建列NOT NULL并在数据库中存储另一个(其他未使用的)值,而不是NULL- 例如-1.然后表达式myCol <> 3将匹配您的假冒 - NULL就像它与任何其他值一样.

SELECT *
FROM MyTable
WHERE myCol <> 3
Run Code Online (Sandbox Code Playgroud)

但总的来说,我建议不要使用这种方法.你正在做的方式是正确的方式.

此外,值得一提的是,其他几个数据库支持IS DISTINCT FROM哪些可以完全满足您的需求:

SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3
Run Code Online (Sandbox Code Playgroud)

MySQL具有NULL安全等于,也可用于此目的:

SELECT *
FROM MyTable
WHERE NOT myCol <=> 3
Run Code Online (Sandbox Code Playgroud)

不幸的是,SQL Server还不支持这些语法中的任何一种.