2016-01-28 108 views
2

我做这些陈述之间有什么区别?

Event.where(state: nil)和送1分的结果,但对于Event.where('state = ?', nil)得到0的结果。

这些有什么区别?

+1

你可以提供每个人的sql输出吗? '.to_sql' – xlembouras

+0

好吧,我现在看到。首先给出'state IS NULL',第二个'state = NULL'。 –

+0

第一个等价查询将是'Event.where('state IS NULL')'。 'Event.where('state =?',nil)'与'Event.where(state:nil)'不一样' – Pavan

回答

5

where(state: nil)的计算结果为WHERE events.state IS NULL,另一个计算结果为SQL中的WHERE (state = NULL)

现在,A NULL相比,任何事情都会返回NULL,除非您使用IS运算符。所以,如果你想检查它是否为NULL,则使用state IS NULL,如果不是NULL,则使用。

state = NULL,返回NULL,其中,在WHERE条款,相当于FALSE,这就是为什么你得到记录。

events.state IS NULL是正确的空比较,所以你得到了你在DB中的输出。

1

它们生成不同的sql。当你有这样的问题时,你可以添加一个.to_sql到你的关系,它会显示你生成并发送到数据库的sql。

Event.where(状态:无)产生此,如果x是像值空

... WHERE events.state IS NULL 

Event.where( '状态=?',零)产生此,检查是否X其中它检查等于null这将永远不会是真的

... WHERE (state = NULL)