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 false1 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.