如何修复SQL near "("语法错误 删除字段中/到&间所有字符
错误原因
- 触发语法报错的核心原因:你当前使用的SQLite环境要么版本过低(低于3.7.15)不支持
INSTR()函数,解析器无法识别函数名,遇到后续的左括号就抛出syntax error near "(";要么是你错误给INSTR()传入了正则表达式'/.+&'——INSTR()本身是精确子串匹配函数,不支持任何正则通配语法,异常的参数格式也可能触发解析报错。 - 语句逻辑完全不满足需求:就算
INSTR()能正常匹配内容,你写的substr(Perevod, 匹配位置-1)只会截取匹配点之后的字符串,直接丢失/前面的所有有效内容,也没有做&前后内容的拼接,根本实现不了“删除指定区间字符”的效果。
正确解决方案
以下方案基于SQLite内置字符串函数实现,不需要额外安装扩展,WHERE条件做了双重校验,仅对同时存在/、且/后方存在&的行做处理,不会改动不符合匹配规则的记录。注意:执行更新前务必先执行查询语句验证结果,避免数据误改无法恢复。
先验证处理结果
执行以下查询确认处理逻辑符合你的预期:
如果需求是保留/和&本身,仅删除两个字符中间的内容(例:a/b&c处理后为a/&c),执行:
SELECT Perevod AS 原始值, SUBSTR(Perevod, 1, INSTR(Perevod, '/')) || SUBSTR(Perevod, INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') + INSTR(Perevod, '/') - 1) AS 处理后值 FROM bal WHERE INSTR(Perevod, '/') > 0 AND INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') > 0;
如果需求是连同/和&两个字符一起删除(例:a/b&c处理后为ac),把查询里的处理逻辑替换为以下内容再执行:
SUBSTR(Perevod, 1, INSTR(Perevod, '/') - 1) || SUBSTR(Perevod, INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') + INSTR(Perevod, '/')) AS 处理后值
确认结果后执行更新
对应「保留/和&、仅删中间内容」的更新语句:
UPDATE bal SET Perevod = SUBSTR(Perevod, 1, INSTR(Perevod, '/')) || SUBSTR(Perevod, INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') + INSTR(Perevod, '/') - 1) WHERE INSTR(Perevod, '/') > 0 AND INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') > 0;
对应「删除/和&及中间全部内容」的更新语句:
UPDATE bal SET Perevod = SUBSTR(Perevod, 1, INSTR(Perevod, '/') - 1) || SUBSTR(Perevod, INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') + INSTR(Perevod, '/')) WHERE INSTR(Perevod, '/') > 0 AND INSTR(SUBSTR(Perevod, INSTR(Perevod, '/')), '&') > 0;
内容的提问来源于stack exchange,提问作者JOHN SMITH
相关产品推荐
相关产品推荐

