我在名为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/
答案 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;
分享并享受。
答案 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
字段分成许多原子字段。