【问题标题】:'NOT IN' condition not working with 'NULL' in list'NOT IN' 条件不适用于列表中的 'NULL'
【发布时间】:2013-12-27 08:47:51
【问题描述】:

我正在开发一个 Rails 3.2 应用程序并使用姿势作为数据库。

以下由 Active Record 生成的查询不起作用。生成这个查询的代码在这个问题Scope for an optional has_one association with itself中。

SELECT "indents".* FROM "indents" WHERE "indents"."type" IN ('Purchase') AND
(id not in (NULL,15017)) ORDER BY indent_date DESC

但如果我手动删除 NULL 并尝试,它可以工作。

SELECT "indents".* FROM "indents" WHERE "indents"."type" IN ('Purchase') AND
(id not in (15017)) ORDER BY indent_date DESC

这里有什么问题?

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord null


    【解决方案1】:

    这是设计使然。在将 anythingNULL 进行比较时,您永远不会得到 TRUE。我引用the manual here

    请注意,如果左边的表达式产生 null,或者如果没有 相等的右侧值和至少一个右侧行产生空值, NOT IN 构造的结果将为 null,而不是 true。这是在 符合 SQL 对空值布尔组合的常规规则。

    你可以在这里找到详细的解释:
    NOT IN in postgresql not working

    如果表达式 (id) 的左侧是 NOT NULL,则修复此问题的一种方法是:

    AND   (id IN (NULL,15017)) IS NOT TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多