我有一张包含以下字段的表格
bought_at
- 空日期
owned
- null布尔值
我想模拟以下查询
SELECT * FROM table WHERE bought_at IS NULL AND owned <> 1
我已经尝试了
.where('bought_at IS NULL AND owned <> 1')
.where(bought_at: nil).not(owned: 1) #fails
.where(bought_at: nil).where.not(owned: 1)
还有一些类似的可能性(如rewhere
)
所有结果集都是空的。但是,如果我尝试owned: 1
或owned = 1
,它就可以正常工作。
我的代码有问题吗?有什么我想念的吗?
@edit
原来这个问题与ror没有关系。该查询的评估如下:
... AND owned <> 1
这就是问题所在。
我仍然不知道为什么,但我认为这与NULL字段的否定有关。由于owned
可能为NULL,实际上有时候,我应该始终使用IS NULL
和IS NOT NULL
,并且引擎可能正在尝试使用此运算符&#39;&lt;&gt; &#39;在NULL值上。
解决方案:
... AND (owned = 0 OR owned IS NULL)
在ROR的术语中
.where(bought_at: nil, owned: [0,nil]')