了解 ActiveRecord 中 where 的查询方法
Understanding query method where in ActiveRecord
我想 return 具有布尔值 show
的用户数,而不是设置为 true。 show
是一个布尔值,但被初始化为 nil
.
正因为如此,我得到了一些我没有预料到的结果。例如,
[{show: nil}].where.not(show: true).count -> 0
[{show: nil}].where(show: [nil, false]).count -> 1
这个查询的 return 不应该是同一件事吗?
这是对NULL
的普遍误解(顺便说一句,这并不少见)。
NULL
没有可比性,既不真也不假,不等于不等于,不小于不大于等等,NULL
甚至不能和[=10比较=].例如NULL = 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。
我想 return 具有布尔值 show
的用户数,而不是设置为 true。 show
是一个布尔值,但被初始化为 nil
.
正因为如此,我得到了一些我没有预料到的结果。例如,
[{show: nil}].where.not(show: true).count -> 0
[{show: nil}].where(show: [nil, false]).count -> 1
这个查询的 return 不应该是同一件事吗?
这是对NULL
的普遍误解(顺便说一句,这并不少见)。
NULL
没有可比性,既不真也不假,不等于不等于,不小于不大于等等,NULL
甚至不能和[=10比较=].例如NULL = 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。