何时或为什么在SQL查询中等于不等于不等于?

时间:2012-07-05 17:22:17

标签: sql oracle toad

在包含Toppings值为“Chocolate”的五条记录的表中,其中两条在MaraschinoCherry列中的值为“Yes”,其他三条在该列中不包含任何内容(不是“No” - 没有/空白)

此查询正常工作:

select definition from desserts 
where (Toppings = 'Chocolate') and 
      (MaraschinoCherry <> 'Yes') 
order by id

...返回预期的三条记录;但这个没有任何回报,而不是我期望的两个记录:

select definition from desserts 
where (Toppings = 'Chocolate') and 
      (MaraschinoCherry = 'Yes') 
order by id

???

1 个答案:

答案 0 :(得分:3)

你的问题的答案很简单。任何与NULL值的比较(有两个例外)都会产生NULL作为结果。所以,

MaraschinoCherry = 'Yes'

MaraschinoCherry <> 'Yes'

当MaraschinoCherry具有NULL值时,两者都返回NULL。 NULL比较的处理方式与FALSE相同。

两个例外是:IS NULL和IS NOT NULL。请注意,“= NULL”始终返回NULL,这被解释为FALSE。

解决这个问题的正常方法是使用COALESCE:

COALESCE(MaraschinoCherry, 'NO') = 'Yes'

(函数ISNULL()是等价的,但COALESCE允许更多参数,是标准SQL。)

还有其他方法可以解决此问题,例如通过在定义表时指定列的默认值,通过向NULL添加显式比较,通过将列声明为“NOT NULL”,或者在某些情况下数据库通过在比较中覆盖NULL的行为来违反SQL标准(强烈不推荐!)。