在SQL中(尤其是Postgres):
在where not foo='bar'
为空的情况下,子句foo
评估为某种null
,导致该行不包括在结果中。
另一方面,其中where (foo='bar') is not true
为空的子句foo
计算为true
(结果中包含该行)。
使用(foo='bar') is not true
等同于foo is null or not foo='bar'
吗?
人们似乎并非出于某种原因使用这种模式,我是否错过了某些东西?
答案 0 :(得分:2)
使用
(foo='bar') is not true
等同于foo is null or not foo='bar'
吗?
是的。或更简单:
foo IS NULL OR foo <> 'bar'
或更简单:
foo IS DISTINCT FROM 'bar'
使用后者。
手册章节Comparison Functions and Operators.中的详细信息
相关:
答案 1 :(得分:0)
怎么样?
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