SQLite 与 NOT 运算符的不一致行为
SQLite inconsistency behavior with the NOT operator
例如,我正在使用这个网站:https://sqliteonline.com/。
我尝试模糊查询并这样做:
SELECT * FROM demo
WHERE Name="SQL " || "Online"
正确检索到的:
1-SQL Online-for Data Science
现在我尝试使用 AND
运算符:
SELECT * FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 2
检索到与之前相同的答案,因为 1
确实不是 2
因此它是 Query AND True=>True
.
但是如果我把它改成别的东西,比方说:
SELECT * FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 1
它returns和以前一样的答案!尽管 1 IS NOT 1
是完全错误的,正如我在这个查询中看到的那样:
SELECT *, 1 IS NOT 1 AS isTrue FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 1
其中 isTrue=0
所以这个查询基本上就是这个:
SELECT *, 1 IS NOT 1 AS isTrue FROM demo
WHERE Name="SQL " || "Online" AND Hint=0
但是当我显式执行这个查询时,它没有检索到任何结果!
这是怎么回事?感谢您的帮助!谢谢。
根据Operators, and Parse-Affecting Attributes,您的条件相当于:
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 2)
因为运算符的优先级。
这意味着它是检查布尔表达式Hint=1
是否是2
。
像 Hint=1
这样的布尔表达式被评估为 0
for false
或 1
for true
.
列 Hint
的值是字符串,在与 1
或任何数字表达式进行比较之前,SQLite 会尝试将它们隐式转换为数值,但由于这是不可能的,因此它们是转换为0
,所以,你的条件相当于:
(Name=("SQL " || "Online")) AND ((0=1) IS NOT 2)
并且由于 0=1
的计算结果为 0
(= false
):
(Name=("SQL " || "Online")) AND (0 IS NOT 2)
或:
(Name=("SQL " || "Online")) AND true
或:
Name="SQL " || "Online"
请注意,您将获得相同的结果:
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 1)
但是,
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 0)
结果将是:
(Name=("SQL " || "Online")) AND false
计算结果为 false
.
例如,我正在使用这个网站:https://sqliteonline.com/。
我尝试模糊查询并这样做:
SELECT * FROM demo
WHERE Name="SQL " || "Online"
正确检索到的:
1-SQL Online-for Data Science
现在我尝试使用 AND
运算符:
SELECT * FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 2
检索到与之前相同的答案,因为 1
确实不是 2
因此它是 Query AND True=>True
.
但是如果我把它改成别的东西,比方说:
SELECT * FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 1
它returns和以前一样的答案!尽管 1 IS NOT 1
是完全错误的,正如我在这个查询中看到的那样:
SELECT *, 1 IS NOT 1 AS isTrue FROM demo
WHERE Name="SQL " || "Online" AND Hint=1 IS NOT 1
其中 isTrue=0
所以这个查询基本上就是这个:
SELECT *, 1 IS NOT 1 AS isTrue FROM demo
WHERE Name="SQL " || "Online" AND Hint=0
但是当我显式执行这个查询时,它没有检索到任何结果!
这是怎么回事?感谢您的帮助!谢谢。
根据Operators, and Parse-Affecting Attributes,您的条件相当于:
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 2)
因为运算符的优先级。
这意味着它是检查布尔表达式Hint=1
是否是2
。
像 Hint=1
这样的布尔表达式被评估为 0
for false
或 1
for true
.
列 Hint
的值是字符串,在与 1
或任何数字表达式进行比较之前,SQLite 会尝试将它们隐式转换为数值,但由于这是不可能的,因此它们是转换为0
,所以,你的条件相当于:
(Name=("SQL " || "Online")) AND ((0=1) IS NOT 2)
并且由于 0=1
的计算结果为 0
(= false
):
(Name=("SQL " || "Online")) AND (0 IS NOT 2)
或:
(Name=("SQL " || "Online")) AND true
或:
Name="SQL " || "Online"
请注意,您将获得相同的结果:
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 1)
但是,
(Name=("SQL " || "Online")) AND ((Hint=1) IS NOT 0)
结果将是:
(Name=("SQL " || "Online")) AND false
计算结果为 false
.