首页 > 解决方案 > 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,

标签: sqlstringoraclecsv

解决方案


我会在这里使用正则表达式替换:

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 值放在单独的行中。


推荐阅读