我有一个表有一列值可以是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还不支持这些语法中的任何一种.