使用substr和instr更新分隔的字符串

时间:2015-04-21 12:51:23

标签: sql oracle decode substr

我在名为datos的列中包含以下数据。我想在第8个斜杠(DR004)之后更新文本,为DR013。

/1/14/0/0/ / / /DR004/1/rttrgftgr/ZM003/0/0/0/1/0/

我尝试过使用此

update sumcon
  set substr(datos, instr(datos, '/', 1, 8) + 1, 1) = 
        decode(substr(datos, instr(datos, '/', 1, 8) + 1, 1), ' ', 'DR013') 
  where nis_rad = 200000732;

但它不起作用。

以下是datos

的数据示例
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / /DR008/1/ /ZM004/0/0/0/0/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/1/0/0/0/
/1/14/0/0/ / / /DR008/1/ /ZM004/0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/0/1/1/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/
/1/14/0/0/ / / /DR001/1/ /ZM004/0/0/0/0/0/
/1/14/0/0/ / / / /1/ / /0/0/0/1/0/

3 个答案:

答案 0 :(得分:2)

根据@LalitKumarB's建议,将您的UPDATE语句更改为

UPDATE SUMCON
  SET DATOS = SUBSTR(DATOS, 1, INSTR(DATOS, '/', 1, 8)) ||
              'DR013' ||
              SUBSTR(DATOS, INSTR(DATOS, '/', 1, 9))
  WHERE NIS_RAD = 200000732;

SQLFiddle here

分享并享受。

答案 1 :(得分:2)

您可以使用正则表达式:

UPDATE sumcon
SET    datos   = REGEXP_REPLACE( datos, '(/(.*?/){7}).*?/', '\1' || :new_value || '/' )
WHERE  nis_rad = 200000732;
  • (/(.*?/){7}) - 会找到第一个/,然后匹配任何字符{0}的零个或多个,直到找到另一个.*?,然后重复此匹配7次(获得第一个斜杠,然后连续7个斜杠) - 这将全部存储在一个捕获组中(由周围的/表示)。
  • ()将匹配任何字符{0}的零个或多个,直到找到另一个.*?/ - 这就是您要替换的内容。

答案 2 :(得分:0)

如果有效,我会感到惊讶。

你可以这样做

update sumcon
set datos = substr(datos, 1, instr(datos, '/', 1, 7) ||
            :new_value ||
            substr(datos, instr(datos, '/', 1, 8)
where nis_rad = 200000732;

但通常你不应该这样做。相反,你应该重新设计你的表并将datos字段分成许多原子字段。