我有一个表,其中有一列值可以是 rowTypeID = (1,2,3, or null)。我想编写一个查询,该查询返回其中没有值为 3 的任何行。在这个例子中,我想要所有 NULL 行以及所有 1,2 行我只是不想要值为 3 的行
rowTypeID = (1,2,3, or null)
Set ANSI null 当前为数据库设置了 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
由于您要求替代方案,另一种方法是制作您的列NOT NULL并在数据库中存储另一个(否则未使用的)值而不是NULL-例如-1. 然后表达式myCol <> 3将匹配你的假 -NULL就像它与任何其他值一样。
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也可用于此目的:
NULL-safe equal
SELECT * FROM MyTable WHERE NOT myCol <=> 3
不幸的是,SQL Server 尚不支持这两种语法中的任何一种。