我在 SQLite 中遇到了一个非常奇怪的布尔表达式行为,或者任何实际发生的情况。
SELECT 1 OR NULL
-- Result: 1
SELECT 0 OR NULL
-- Result: NULL
它甚至解释字符串并执行同样奇怪的评估:
SELECT '789abc' OR NULL
-- Result: 1
SELECT '000abc' OR NULL
-- Result: NULL
表达式的顺序并不重要,如果您添加更多相似的表达式和运算符,它的计算结果仍然相同。 有人可以解释一下这种奇怪的不对称背后的逻辑吗?幕后发生了什么?
SQLite 使用类型强制,将非零数字和非空字符串解释为
true
,将零或空字符串解释为 false
。因此:
1 OR NULL
返回 1
,因为 1
是 true
,true OR anything
是 true
。0 OR NULL
返回 NULL
,因为 0
是 false
,并且 false OR NULL
未知 (NULL
)。'789abc' OR NULL
返回 1
,因为非空字符串是 true
。'000abc' OR NULL
返回 NULL
,因为该字符串虽然非空,但与布尔上下文中的 0
进行比较时,会隐式转换为数值(在本例中为 NULL
,因为有前导零),结果在false OR NULL
,即NULL