PL/SQL更新语句编写求助:正则截断数据库描述字段内容
解决方案:PL/SQL 更新语句保留 (ehem...) 及其左侧内容
针对你描述的需求——截断(ehem. 123)右侧所有内容,仅保留该括号片段及其左侧部分,这里提供两种PL/SQL更新方案,适配不同数据场景:
场景1:每个字符串仅含一个 (ehem...) 片段
如果你的数据中每条记录最多只有一处(ehem...)格式的内容,可以用这条语句:
UPDATE your_table SET description = CASE WHEN INSTR(description, '(ehem') > 0 THEN -- 截取从开头到 (ehem...) 右括号的所有内容 SUBSTR(description, 1, INSTR(description, ')', INSTR(description, '(ehem'))) ELSE -- 没有 (ehem 片段的记录保持原样 description END -- 仅更新包含 (ehem 片段的记录,提升效率 WHERE INSTR(description, '(ehem') > 0;
语句解释:
INSTR(description, '(ehem'):定位字符串中第一次出现(ehem的位置(兼容(ehem.和(ehem两种格式)。INSTR(description, ')', INSTR(description, '(ehem')):从(ehem的起始位置开始,找到对应的右括号)的位置,也就是(ehem...)的结束点。SUBSTR(description, 1, ...):截取从字符串开头到该右括号的所有字符,完美保留目标内容。
场景2:字符串可能包含多个 (ehem...) 片段
如果存在一条记录里有多处(ehem...)的情况,且你需要保留最后一个(ehem...)及其左侧内容,可以用反向查找的版本:
UPDATE your_table SET description = CASE WHEN INSTR(description, '(ehem', -1) > 0 THEN -- 从末尾开始找最后一个 (ehem 的位置,再定位对应的右括号 SUBSTR(description, 1, INSTR(description, ')', INSTR(description, '(ehem', -1))) ELSE description END WHERE INSTR(description, '(ehem', -1) > 0;
这里INSTR(description, '(ehem', -1)是从字符串末尾开始反向查找(ehem的位置,确保定位到最后一处目标片段。
测试验证
用你给出的示例测试:
- 原字符串:
Part 1 (ehem. 123) - Part 2 - [Part 3]→ 更新后:Part 1 (ehem. 123) - 原字符串:
Part 1 (ehem. 123) - [Part 3]→ 更新后:Part 1 (ehem. 123) - 原字符串:
Part1-Part1 (ehem 123)→ 无右侧内容,保持原字符串不变 - 含连字符的Part1:
E-Banking (ehem. 456) - Extra→ 更新后:E-Banking (ehem. 456)
所有场景都能满足你的需求。
内容的提问来源于stack exchange,提问作者dwin90
相关产品推荐
相关产品推荐

