【问题标题】:Finding null values when I write a query in rails在 Rails 中编写查询时查找空值
【发布时间】:2012-10-11 21:12:29
【问题描述】:

我刚刚编写了以下查询并得到了一个(对我来说)惊喜的结果;

Customer.where("satisfaction != ?","Very satisfied")

这返回的值比我预期的要少得多,原因是我的满意度列的数据库中存在空值。要获得我想要的记录,我必须编写以下查询

Customer.where("satisfaction != ? or satisfaction is null","Very satisfied")

这可行,但它很丑陋,我希望有更好的方法(特别是因为我计划动态生成这些查询,所以我希望它们尽可能简单)。是否存在将空值与不相等值合并的运算符?

我的数据库是开发中的 SQLite3 和生产中的 Postgresql。

【问题讨论】:

  • 哪个环境产生了令人惊讶的结果?
  • SQLite3 产生了令人惊讶的结果
  • 任何数据库甚至会假装对标准进行口头上的服务。

标签: sql ruby-on-rails sqlite postgresql


【解决方案1】:

在 PostgreSQL 中,您可以使用 IS DISTINCT FROM 来解决常见的 NULL 问题:

Customer.where('satisfaction is distinct from ?', 'Very satisfied')

在 SQLite 中,我认为您被明确的 IS NULL 检查或同样丑陋的 COALESCE 所困扰:

Customer.where("coalesce(satisfaction, '') != ?", 'Very satisfied')

COALESCE 计算出它的第一个非 NULL 参数,并且可以在 SQLite 和 PostgreSQL 中工作;您可以使用与您的'Very satisfied' 不匹配的任何内容来代替空字符串。

我强烈建议您在 PostgreSQL 上进行部署时停止在 SQLite 上进行开发。当 SQLite 对 SQL 的宽松解释与 PostgreSQL 更严格的解释发生冲突时,您只是在生产服务器上要求一个糟糕的时间。不要对自己这样做,使用相同的数据库进行开发和部署(其中 same 包括版本号)。

您可能还想重新访问您的架构,看看您是否可以将 NOT NULL 约束添加到您的 satisfaction 列。一个显式的'Unknown' 字符串也可以起到同样的作用,并且可以避免通常的NULL 废话。我倾向于手动将所有内容默认为 NOT NULL,并且仅在可以证明的情况下才允许 NULL。

【讨论】:

  • 我已经通过艰难的方式学习了在同一个数据库上开发和部署的课程。这是我目前的做法,但这是我正在重新访问的旧应用程序。再次感谢您的出色回答。
  • 这里显然不需要空值。该值可能是“没有答案”或类似的。遗憾的是 SQL 中的默认列不是 NOT NULL。
  • @RichardHuxton:很遗憾 ActiveRecord 传播了这种糟糕的默认值。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多