我有一个列,其中包含带有逗号分隔值的初始字符串,例如:
TEST-10=5,TEST-136=6,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9013=100,TEST-9=4
我需要replace或TEST来删除子字符串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,
发布于 2020-10-26 21:59:00
你只是在找replace()
吗?
replace(replace(mycolumn, 'TEST-136=6', ''), 'TEST-9013=100', '')
如果您想要将其泛化:
regexp_replace(mycolumn, '(TEST-136|TEST-9013)=[0-9]*', '', 1, 0)
如果您希望对此进行泛化并删除下一个逗号:
regexp_replace(mycolumn, '(TEST-136|TEST-9013)=[0-9]*,?', '', 1, 0)
发布于 2020-10-26 22:05:54
我将在这里使用正则表达式替换:
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值放在单独的行中。
https://stackoverflow.com/questions/64538582
复制相似问题