我在Rails3应用程序中遇到了意外的postgres查询问题。
我以为我可以通过stackoverflow来运行它,看看互联网的大脑怎么说:)
这是预期的结果(为什么?!)还是错误?
假设我在Postgres 9.1.4数据库中有一个表Orders:
id state
===== ======
1 <-- nil (default value)
2 'success'
3 'failure'
当我运行查询时:
Order.where('orders.state != ?', 'success').map { |order| order.id }
Order Load (3.8ms) SELECT "orders".* FROM "orders" WHERE (orders.state != 'success')
=> [3]
我期待的结果是[1,3]。显然有两行满足(!='success')。
为什么nil!='success'在这里不正确? !=只是忽略NULL值吗?应该是?
注意:我通过使用以下查询产生了所需的结果:
Order.where('orders.state IS NULL OR orders.state != ?', 'success').map { |order| order.id }
Order Load (2.3ms) SELECT "orders".* FROM "orders" WHERE (orders.state IS NULL OR orders.state != 'success')
=> [1, 3]
任何意见,将不胜感激。
最佳答案
PostgreSQL中有一个IS DISTINCT FROM比较运算符:
例如,给定您的样本数据:
=> select * from orders where state is distinct from 'success';
id | state
----+---------
1 |
3 | failure
(2 rows)
所以你可以这样说:
Order.where('orders.state is distinct from ?', 'success').pluck(:id)
请注意,我还切换到了
pluck
而不是您的map(&:id)
,它将把此SQL发送到数据库:select id from orders where orders.state is distinct from 'success'
而不是使用带有客户端过滤器的
select orders.* ...
来提取id
。关于sql - SQL查询中的结果为NULL!=的结果(postgres和rails3),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16486409/