【发布时间】:2013-04-20 06:19:32
【问题描述】:
我的 oracle 数据库中有一个列,由于我无法控制的原因包含一个 CSV 字符串,例如
项目a,项目b,项目c,项目d
我想运行一条 UPDATE 语句来删除项目 c。因此以
结束项目a,项目b,项目d
我怎样才能做到这一点
【问题讨论】:
我的 oracle 数据库中有一个列,由于我无法控制的原因包含一个 CSV 字符串,例如
项目a,项目b,项目c,项目d
我想运行一条 UPDATE 语句来删除项目 c。因此以
结束项目a,项目b,项目d
我怎样才能做到这一点
【问题讨论】:
您可以使用 Oracle REPLACE 函数:
UPDATE table
SET col = replace(col, 'item c', '')
您只需要小心处理它作为 CSV 的一部分,例如去掉后面的逗号。这可能意味着先替换“项目 c”,然后替换“项目 c”以捕获这两种情况。
编辑:啊,我可能误解了。我的解决方案是基于从 CSV 中删除特定字符串 - 如果您希望始终替换第三项,那么文森特的答案就是您需要的答案
【讨论】:
如果你有一个相当新的 Oracle 版本(我相信正则表达式是在 Oracle 10 中引入的),你可以使用REGEXP_REPLACE:
UPDATE table SET column = REGEXP_REPLACE(column,'[^\,]+,','',1,3)
(另外,请对以这种方式将 CSV 存储在关系数据库中的天才做一些暴力行为。)
【讨论】:
您可以使用 INSTR 和 SUBSTR 的组合来删除第三个字段:
SQL> WITH a AS (SELECT 'Item a,Item b,Item c,Item d' col FROM dual)
2 SELECT substr(col, 1, instr(col, ',', 1, 2))
3 || substr(col, instr(col, ',', 1, 3) + 1) sub
4 FROM a;
SUB
--------------------
Item a,Item b,Item d
【讨论】: