在rails中编写查询时查找空值

时间:2012-10-22 04:33:33

标签: sql ruby-on-rails sqlite postgresql

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

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

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

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

这有效,但它很难看,我希望有更好的方法(特别是当我计划动态生成这些查询时,我希望它们尽可能简单)。是否有一个运算符包含空值和不相等的值?

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

1 个答案:

答案 0 :(得分:5)

在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更严格的解释冲突时,你只是在生产服务器上要求一个糟糕的时间。不要自己动手,使用相同的数据库进行开发和部署(其中相同的包括版本号)。

您可能还想重新访问架构,以查看是否可以向satisfaction列添加NOT NULL约束。明确的'Unknown'字符串也可以提供,并且可以避免通常的NULL废话。我倾向于手动将所有内容默认为NOT NULL,并且只有在我可以证明它的情况下才允许NULL。