我在做
Event.where(state: nil)
获得1个结果,但Event.where('state = ?', nil)
获得0个结果。
这些之间有什么区别?
答案 0 :(得分:5)
where(state: nil)
的计算结果为WHERE events.state IS NULL
,其他人的计算结果为WHERE (state = NULL)
。
现在,除了使用NULL
运算符之外,与NULL
进行比较的任何内容都会返回IS
。因此,如果您想检查它是否为NULL
,请使用state IS NULL
,如果不是NULL
则state IS NOT NULL
。
state = NULL
,返回NULL
,其中WHERE
子句相当于FALSE
,这就是您获得 0 记录的原因。
events.state IS NULL
是正确的空比较,因此您可以获得数据库中的输出。
答案 1 :(得分:1)
他们生成不同的sql。当您遇到这样的问题时,您可以将.to_sql添加到您的关系中,它将显示生成并发送到数据库的sql。
Event.where(state:nil)生成this,它检查x是否为null值
... WHERE events.state IS NULL
Event.where(' state =?',nil)产生这个,它检查X是否等于null永远不会为真
... WHERE (state = NULL)