SQLite3如何查询与另一列名匹配的列值 等于匹配失效问题
问题根因
这不是SQLite的Bug,是引号语义的认知偏差导致的问题:
SQLite默认遵循SQL标准的引号规则:
- 单引号
'包裹的内容会被识别为字符串字面量 - 双引号
"包裹的内容会被识别为标识符(比如列名、表名)
你写的WHERE Name = "Value"语句里,"Value"被识别为表中定义的Value列,而非字符串Value,等价于WHERE Name = Value,实际是在比较同一行的Name列值和Value列值。你表中Name为Value的行Value列值是3,字符串Value和整数3比较不相等,所以没有返回结果。
为什么LIKE和子查询能生效
- LIKE后的
"Value%"包含%通配符,不可能是合法的标识符,SQLite会自动降级识别为字符串字面量,所以能正常匹配 - 子查询
SELECT Name FROM Test WHERE Value = 3返回的是Name列实际存储的字符串Value,IN比较的是两个字符串,所以匹配成功
解决方法
方法1(推荐,符合SQL标准)
字符串字面量统一用单引号包裹,修改查询语句为:
SELECT * FROM Test WHERE Name = 'Value';
方法2(不推荐,仅做兼容使用)
如果你一定要用双引号包裹字符串,可以执行开启双引号字符串支持的PRAGMA:
PRAGMA quoted_strings = ON;
开启后再执行原来的WHERE Name = "Value"就能正常返回结果,但这种写法不符合SQL通用标准,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者SFox
相关产品推荐
相关产品推荐

