sql - Oracle SQL在列中查找子字符串加2个字符并删除子字符串
问题描述
我有一列包含带有逗号分隔值的初始字符串,例如:
TEST-10=5,TEST-136=6,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9013=100,TEST-9=4
我需要替换或 regexp_replace SQL 来删除子字符串 TEST-136=2,这样我就会得到结果字符串:
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9013=100,TEST-9=4
以下 SQL 仅从列字符串中删除例如 TEST-136,但不删除“=6”部分:
UPDATE mytable SET mycolumn = REPLACE(mycolumn, 'TEST-136', '');
此外,如果可能的话,我什至想删除 2 个或更多我想要的特定子字符串,这意味着 TEST-136=6 和 TEST-9013=100,因此结果字符串为:
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4
请注意,TEST-136=6, TEST-9013=100 可以在列字符串的随机位置,不是特定的。
此外,TEST-136=6 或 TEST-9013=100 可以在字符串的末尾,因此在这种情况下,还需要删除在删除子字符串后将存在的逗号。例如:
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,TEST-9013=100
应该变成:
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4
并不是:
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,
解决方案
我会在这里使用正则表达式替换:
SELECT
col,
TRIM(BOTH ',' FROM REGEXP_REPLACE(col, ',?TEST-(136|9013)=[0-9]+,?', ',')) AS col_out
FROM yourTable;
此处的正则表达式替换逻辑是查找TEST-\d+=\d+
某些值以及可选的前导/尾随逗号。然后我们只用一个逗号替换。如果替换目标是 CSV 字符串中的第一个或最后一个条目,这里有一个边缘情况。在这种情况下,可能会留下前导/尾随逗号。所以我们去掉这些逗号。
请注意,这里的最佳答案可能是告诉您停止在 SQL 表中存储 CSV。进行这样的字符串操作来更新您的表是非常昂贵的,而不是数据库的预期用途。相反,请考虑将每个 CSV 值放在单独的行中。
推荐阅读
- javascript - 如何在 OUTPUT 部分使用 VSCode Code Runner 显示完整对象?
- c# - 是否可以使用模式创建接口的自定义实现?
- outlook - 如何让 ics 文件调整为当地时间而不是更改时间
- swift - 当我尝试将边框的颜色设置为渐变颜色时,如何解决此错误
- c# - 在 Material Design 中使用 datagrind 允许行增长和文本换行
- android - Smartech SDK 通知图标看起来像方形块
- javascript - 如何使用 jQuery 禁用表单字段并将其值设置为 nil?
- typescript - sequelize V6 typescript:使用 findall 将数据作为普通对象获取
- python - 在 Django FilterSet 中使用 CheckBox
- c# - 创建侦听器时调用Firestore“ListenerRegistration”,应该是?