You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:30:01