SQL:“条件不正确”模式替换为“是否为空(条件)”

时间:2019-07-25 16:51:30

标签: sql postgresql null comparison

在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'吗?

人们似乎并非出于某种原因使用这种模式,我是否错过了某些东西?

2 个答案:

答案 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