SQLite如何删除多列中均不包含指定字符串的所有行
SQLite 删除多列均不包含指定字符串的行的高效实现
核心逻辑:需要删除的是所有待检查列都不包含目标字符串的行,只要任意一列包含目标字符串,该行就保留。
性能最优的通用写法
直接逐列做模糊匹配,用AND连接所有列的判断条件,这是SQLite中执行开销最低的写法,不需要额外函数计算、字符串拼接,数据库引擎可以直接逐行判断:
-- 替换为实际的表名、列名即可 DELETE FROM 你的表名 WHERE 列1 NOT LIKE '%Steel%' AND 列2 NOT LIKE '%Steel%' AND 列3 NOT LIKE '%Steel%';
注意:这里必须用
AND连接条件,不要用OR。只有当所有列都不包含'Steel'时,行才会被删除;如果误用OR,会导致只要某一列不包含'Steel'就删行,出现大面积误删。
列数较多时的简化写法
如果需要检查的列非常多,手动枚举所有列名效率低,可以通过SQLite内置的pragma_table_info查询表结构,自动生成删除语句:
-- 替换语句里的表名、目标字符串,执行后会直接输出拼接完成的DELETE语句 SELECT 'DELETE FROM 你的表名 WHERE ' || GROUP_CONCAT(name || ' NOT LIKE ''%Steel%''', ' AND ') || ';' FROM pragma_table_info('你的表名');
复制查询输出的SQL语句,确认逻辑无误后执行即可。
注意事项
- 默认情况下SQLite的
LIKE对ASCII范围内的英文字符大小写不敏感,如果需要严格区分大小写,可以将LIKE替换为GLOB,或者执行PRAGMA case_sensitive_like = ON;开启大小写敏感匹配。 - 如果目标字符串本身包含
%、_这类LIKE通配符,需要增加转义符处理,例如匹配字符串Steel_1时,写法为NOT LIKE '%Steel\_1%' ESCAPE '\'。

内容的提问来源于stack exchange,提问作者Jordy Steyaert
相关产品推荐
相关产品推荐

