如何使用sqlite3删除数据库中指定关键词及其后方的所有内容
你现有写法存在两个核心错误:
- 匹配规则错误:
like '%bantlon'仅能匹配以bantlon结尾的字段内容,无法覆盖关键词出现在字段任意位置的场景,不符合「包含关键词就排除」的要求 - 功能缺失:仅做了整行删除,没有实现「删除关键词及后方所有内容」的字段裁剪需求
正确实现方案
以下方案默认以PostgreSQL语法为例,其他数据库可替换对应字符串函数即可。
1. 处理第一张表(表名shirt,目标字段mat)
需求:插入所有不包含bantlon关键词的条目,且合法条目的mat字段要删除bantlon及后方所有内容。
插入数据时直接处理(推荐)
INSERT INTO shirt (mat, 其余字段名) SELECT -- 裁剪字段内容:存在关键词则取前面的部分,不存在则返回原内容 CASE WHEN POSITION('bantlon' IN mat) > 0 THEN TRIM(LEFT(mat, POSITION('bantlon' IN mat) - 1)) ELSE mat END AS processed_mat, 其余字段对应值 FROM 数据源表 -- 过滤掉包含bantlon关键词的行 WHERE POSITION('bantlon' IN mat) = 0;
已全量插入数据后的事后清洗方案
-- 第一步:删除所有包含bantlon关键词的行 DELETE FROM shirt WHERE mat LIKE '%bantlon%'; -- 第二步:裁剪剩余合法行的mat字段 UPDATE shirt SET mat = TRIM(LEFT(mat, POSITION('bantlon' IN mat) - 1)) WHERE POSITION('bantlon' IN mat) > 0;
2. 处理第二张表(表名banto,目标字段mat)
逻辑和第一张表完全一致,仅需替换关键词为shirt即可。
插入数据时直接处理
INSERT INTO banto (mat, 其余字段名) SELECT CASE WHEN POSITION('shirt' IN mat) > 0 THEN TRIM(LEFT(mat, POSITION('shirt' IN mat) - 1)) ELSE mat END AS processed_mat, 其余字段对应值 FROM 数据源表 WHERE POSITION('shirt' IN mat) = 0;
事后清洗方案
DELETE FROM banto WHERE mat LIKE '%shirt%'; UPDATE banto SET mat = TRIM(LEFT(mat, POSITION('shirt' IN mat) - 1)) WHERE POSITION('shirt' IN mat) > 0;
不同数据库的函数适配
- MySQL:将
POSITION(关键词 IN 字段名)替换为INSTR(字段名, 关键词),其余函数通用 - SQL Server:将
POSITION替换为CHARINDEX(关键词, 字段名),其余函数通用
内容的提问来源于stack exchange,提问作者Omar Gamal
相关产品推荐
相关产品推荐

