我有一个表的列可以是rowTypeID =(1,2,3或null)的值列.我想编写一个返回任何没有值为3的行的查询.在这个例子中,我想要所有的NULL行以及所有的1,2行,我只是不希望值为3的行
当前为数据库设置ANSI空值ON.
我很好奇为什么我不能写
select * from myTable where myCol <> 3
此查询不会返回myCol列中具有NULL的任何行
我必须写
select * from my Table where myCol <> 3 or myCol Is NULL
我总是必须包含IS NULL或者我可以设置它,因此where子句myCol 3将返回具有Null的行作为我的Col的值
解决方法
我认为你的做法很好:
SELECT * FROM MyTable WHERE myCol <> 3 OR myCol IS NULL
由于您要求替代方案,所以执行此操作的另一种方法是使列不为NULL,并在数据库中存储另一个(otherwised未使用的)值,而不是NULL – 例如-1.然后,表达式myCol<> 3将匹配您的假NULL,就像它与任何其他值一样.
SELECT * FROM MyTable WHERE myCol <> 3
然而,一般来说,我建议不要使用这种方法.你已经在做的方式是正确的方法.
另外值得一提的是,其他几个数据库支持IS DISTINCT FROM,它们完全符合您的要求:
SELECT * FROM MyTable WHERE myCol IS DISTINCT FROM 3
MysqL有NULL-safe equal也可以用于这个目的:
SELECT * FROM MyTable WHERE NOT myCol <=> 3