bra*_*rad 1 sql sqlite postgresql ruby-on-rails
我刚刚编写了以下查询并得到了一个惊喜(对我而言)结果;
Customer.where("satisfaction != ?","Very satisfied")
Run Code Online (Sandbox Code Playgroud)
返回的值远远低于我预期的值,原因是数据库中的满足列为空值.要获取我想要的记录,我必须编写以下查询
Customer.where("satisfaction != ? or satisfaction is null","Very satisfied")
Run Code Online (Sandbox Code Playgroud)
这有效,但它很难看,我希望有更好的方法(尤其是我计划动态生成这些查询,所以我希望它们尽可能简单).是否有一个运算符包含空值和不相等的值?
我的数据库是开发中的SQLite3和生产中的Postgresql.
在PostgreSQL中,您可以使用IS DISTINCT FROM来解决通常的NULL问题:
Customer.where('satisfaction is distinct from ?', 'Very satisfied')
Run Code Online (Sandbox Code Playgroud)
在SQLite中,我认为你坚持使用明确的IS NULL检查或同样丑陋的COALESCE:
Customer.where("coalesce(satisfaction, '') != ?", 'Very satisfied')
Run Code Online (Sandbox Code Playgroud)
COALESCE评估它的第一个非NULL参数,并且可以在SQLite和PostgreSQL中使用; 你可以使用任何与你'Very satisfied'的空字符串不相匹配的东西.
我强烈建议您在PostgreSQL上部署时停止在SQLite上进行开发.当SQLite对SQL的松散解释与PostgreSQL更严格的解释冲突时,你只是在生产服务器上要求一个糟糕的时间.不要这样对自己,开发和使用相同的数据库(其中部署同包括版本号).
您可能还想重新访问模式,以查看是否可以向satisfaction列添加NOT NULL约束.显式'Unknown'字符串也可以同样起作用,并避免通常的NULL废话.我倾向于手动将所有内容默认为NOT NULL,并且只有在我可以证明它的情况下才允许NULL.
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |