我在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/

10-14 00:22