在SQL中(特别是Postgres(:
在foo
为空的情况下where not foo='bar'
子句的计算结果为某种null
,导致该行不包含在结果中。
另一方面,foo
为 null 的子句where (foo='bar') is not true
计算结果为 true
(该行包含在结果中(。
那么使用(foo='bar') is not true
等同于foo is null or not foo='bar'
吗?
人们似乎不是出于某种原因使用这种模式,我错过了什么吗?
那么使用
(foo='bar') is not true
等同于foo is null or not foo='bar'
吗?
是的。或者更简单:
foo IS NULL OR foo <> 'bar'
或者更简单:
foo IS DISTINCT FROM 'bar'
使用后者。
手册章节比较函数和运算符中的详细信息。
相关:
- 检查"空值或空值"的最佳方法
这个怎么样?
where coalesce(foo, 'foo') <> 'bar'
或
where not coalesce(foo, 'foo') = 'bar'
我怀疑人们正在避免IS NOT TRUE
因为它在Oracle和MS SQL Server中不起作用。 使用MS SQL Server的人将避免使用ISNULL
功能的原因相同。
对评论的回应:
我不知道你说的不可能的"foo"是什么意思。 你的意思是不可能的值吗? 不对。 它只需要不是"酒吧"。这仍然有效:
declare @foo varchar(15)
declare @bar varchar(15)
set @bar = 'bar'
--set @foo = 'bar'
--set @foo = 'asdf'
select 7
where coalesce( @foo, 'not' + @bar) <> @bar