在包含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
???
答案 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标准(强烈不推荐!)。