sar*_*nce 0 ruby-on-rails rails-activerecord
我想返回布尔值show未设置为 true 的用户数。show是一个布尔值,但被初始化为nil.
正因为如此,我得到了一些我没有预料到的结果。例如,
[{show: nil}].where.not(show: true).count -> 0
Run Code Online (Sandbox Code Playgroud)
[{show: nil}].where(show: [nil, false]).count -> 1
Run Code Online (Sandbox Code Playgroud)
这个查询不应该返回同样的东西吗?
这是一个普遍的误解NULL(顺便说一句,这并不少见)。
NULL是不可比的,它既不是真也不是假,也不是等于或不等于,也不是小于或大于等等,NULL甚至不能与 相比较NULL。egNULL = NULL是假的,但NULL != NULL也是假的。
您的第一种情况 ( .where.not(show: true)) 是show != true(或NOT(show =true)) 相当于show = false.
你的第二个例子 ( .where(show: [nil, false])) 是show IS NULL OR show = false. 虽然这种语法show: [x,y]通常会导致一个IN()子句Arel足够聪明,可以意识到这些值之一是nil并相应地转换 SQL 生成,因为show IN (NULL,false)将等效于show = NULL OR show = false(这是如何IN()工作的),但如上所述NULL = NULL是错误的,因此为什么IS NULL和IS NOT NULL存在。
您的查询结果是因为没有 show = false 的行,但有一行 show IS NULL。