我在这里看到一个帖子:Why does PostgreSQL not return null values when the condition is <> true的答案解释了为什么它发生但我还是不确定如何修复它。
我正在运行类似于此的查询:
SELECT * FROM beers WHERE name != 'Budlight';
我希望它返回name
不等于Budlight
的行。结果应包括名称为NULL
的行。相反,我的结果显示name
不是Budlight
或NULL
的行。
如何在结果中省略名称不是Budlight
的行的查询?
SQLFiddle:http://www.sqlfiddle.com/#!15/7b9bd/1
答案 0 :(得分:6)
Postgres提供is distinct from
运营商。你可以这样做:
SELECT *
FROM beers
WHERE name IS DISTINCT FROM 'Budlight';
这符合您对NULL
值的期望。
documentation中解释了此运算符。
答案 1 :(得分:3)
SQL标准方式只是说OR col IS NULL
,例如
SELECT * FROM beers WHERE name <> 'Budlight' OR name IS NULL;
戈登的回答指出IS DISTINCT FROM
一种非sql标准的说法。请注意,PostgreSQL可能无法有效地为IS DISTINCT FROM
使用索引,因此我倾向于仅在比较标量的触发器中使用它,并在其余时间使用col <> 'something' OR col IS NULL
。