0

在包含五条 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

???

4

1 回答 1

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 标准(强烈不推荐!)。

于 2012-07-05T17:53:29.867 回答