SQLite使用NOT GLOB仍返回需排除字符串的问题求助
SQLite更新查询排除指定记录问题
我需要在SQLite中执行列更新操作:当title字段包含指定字符串时更新对应列,但要排除匹配特定字符串的记录。注意SQLite不允许在UPDATE关联的查询中使用EXCEPT语句(单独使用SELECT时EXCEPT可以正常工作)。目前我注释了UPDATE语句来测试SELECT部分,但查询仍然返回了包含“Shovel Test”的记录,而这正是我想要排除的内容。测试的SQL语句如下:
SELECT * FROM AUDIT_INVENTORY_20250307 --UPDATE AUDIT_INVENTORY_20250307 --SET NAMING_CONVENTION = 'Persistent draft, test or training items older than 60 days' WHERE LOWER(title) GLOB LOWER('*Test*') OR LOWER(title) GLOB LOWER('*Testing*') OR LOWER(title) GLOB LOWER('*Delete*') OR LOWER(title) GLOB LOWER('*Untitled*') OR LOWER(title) GLOB LOWER('*Draft*') OR LOWER(title) GLOB LOWER('*Training*') AND LOWER(title) NOT GLOB LOWER('*Shovel Test*') AND created > '2025/01/07'
问题原因
逻辑运算符优先级问题:AND的优先级高于OR,导致你的排除条件LOWER(title) NOT GLOB LOWER('*Shovel Test*')仅与最后一个OR条件LOWER(title) GLOB LOWER('*Training*')绑定,其他OR条件(比如匹配*Test*的记录)不会受到排除约束,所以包含“Shovel Test”的记录因为匹配了*Test*就被筛选出来了。
修正后的SQL语句
把所有需要匹配的OR条件用括号包裹,形成一个整体条件,再与排除条件、日期条件用AND连接:
-- 先测试SELECT验证结果 SELECT * FROM AUDIT_INVENTORY_20250307 WHERE ( LOWER(title) GLOB LOWER('*Test*') OR LOWER(title) GLOB LOWER('*Testing*') OR LOWER(title) GLOB LOWER('*Delete*') OR LOWER(title) GLOB LOWER('*Untitled*') OR LOWER(title) GLOB LOWER('*Draft*') OR LOWER(title) GLOB LOWER('*Training*') ) AND LOWER(title) NOT GLOB LOWER('*Shovel Test*') AND created > '2025/01/07'; -- 确认结果正确后执行UPDATE UPDATE AUDIT_INVENTORY_20250307 SET NAMING_CONVENTION = 'Persistent draft, test or training items older than 60 days' WHERE ( LOWER(title) GLOB LOWER('*Test*') OR LOWER(title) GLOB LOWER('*Testing*') OR LOWER(title) GLOB LOWER('*Delete*') OR LOWER(title) GLOB LOWER('*Untitled*') OR LOWER(title) GLOB LOWER('*Draft*') OR LOWER(title) GLOB LOWER('*Training*') ) AND LOWER(title) NOT GLOB LOWER('*Shovel Test*') AND created > '2025/01/07';
内容的提问来源于stack exchange,提问作者tpcolson
相关产品推荐
相关产品推荐

