ActiveRecord中where查询疑问:where.not(show: true)与匹配[nil,false]结果为何不一致
这是因为SQL采用三值逻辑,NULL和任何值做比较运算的结果都是UNKNOWN,而WHERE子句只会保留条件判断结果为TRUE的记录,两条ActiveRecord查询最终生成的SQL条件逻辑不同,才会导致结果不一致,具体原因如下:
- 第一条查询
where.not(show: true)
最终生成的SQL条件为show != TRUE。对于show值为nil(对应SQL的NULL)的记录,NULL != TRUE的判断结果为UNKNOWN,不满足WHERE条件,所以没有匹配到任何记录,返回计数为0。 - 第二条查询
where(show: [nil, false])
ActiveRecord处理带nil的IN查询时,会自动优化为show IS NULL OR show = FALSE的SQL条件。NULL值会被IS NULL条件命中,所以show为nil的记录会被匹配到,返回计数为1。
如果你需要统计所有show不为true的用户,正确的写法就是第二种where(show: [nil, false]),也可以写为:
where.not(show: true).or(where(show: nil))
内容的提问来源于stack exchange,提问作者sara lance
相关产品推荐
相关产品推荐

