【问题标题】:Postgresql and comparing to an empty fieldPostgresql 并与空字段进行比较
【发布时间】:2011-05-06 19:49:08
【问题描述】:

似乎在 PostgreSQL 中,empty_field != 1(或其他值)是 FALSE。如果这是真的,有人可以告诉我如何与空字段进行比较吗?

我有以下查询,翻译为“选择用户组中尚未投票的所有帖子:

SELECT p.id, p.body, p.author_id, p.created_at
FROM posts p
LEFT OUTER JOIN votes v ON v.post_id = p.id
WHERE p.group_id = 1 
AND v.user_id != 1

它什么也不输出,即使 votes 表是空的。也许我的查询有问题,而不是上面的逻辑?

编辑:似乎将v.user_id != 1 更改为v.user_id IS DISTINCT FROM 1 完成了这项工作。 来自 PostgreSQL 文档:

对于非空输入,IS DISTINCT FROM 与 运算符相同。 但是,当两个输入都为空时 将返回 false,当只有一个 输入为 null 它将返回 true。

【问题讨论】:

标签: postgresql select null compare


【解决方案1】:

如果你想返回 v.user_id 为 NULL 的行,那么你需要特别处理。解决它的一种方法是编写:

AND COALESCE(v.user_id, 0) != 1

另一种选择是:

AND (v.user_id != 1 OR v.user_id IS NULL)

编辑:spacemonkey 是正确的,在 PostgreSQL 中你应该在这里使用IS DISTINCT FROM

【讨论】:

  • 似乎 IS DISTINCT FROM 也完成了这项工作
  • @spacemonkey:你是对的。这实际上是在 PostgreSQL 中执行此操作的更好方法。我完全忽略了它。
【解决方案2】:

NULL 是一个未知值,因此它永远不会等于某个值。研究使用 COALESCE 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多