使用同一列的一部分替换表列的值

时间:2019-05-31 13:12:03

标签: sql oracle oracle11g sql-update

我正在更新表中的一列,用其现有值的一部分替换一列:

Update Table_Name Set VarName '12345' where VarName = 'AA-BB-12345';
Update Table_Name Set VarName '99999' where VarName = 'XX-AR-99999';
...

如何循环执行此操作,以使其在整个Table_Name表中进行更改,从而拉出VarName的最后一个元素并使用该元素进行更新?该表中有500行需要更新,太多行不能执行单个更新行,因此我需要一个循环来完成此操作。

我认为这很接近:

Update Table_Name
set VarName = ( select regexp_substr(VarName, '[^-]+,1,3 ) from Table_Name );

1 个答案:

答案 0 :(得分:2)

并不是很遥远,但是您的子查询并不相关-子查询找到的值与要更新的行之间没有链接,因此您可能会遇到ORA-01427错误。但是,由于要更新同一行,因此不需要子查询:

update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3);

您也可以不使用正则表达式:

update table_name set varname = substr(varname, instr(varname, '-', -1) + 1);

还有一个优点是不会使任何非预期模式的行都为空。即使这样,您也可以通过仅用破折号更新值来减少不必要的工作:

update table_name set varname = substr(varname, instr(varname, '-', -1) + 1)
where instr(varname, '-', -1) > 0;

update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3)
where regexp_substr(varname, '[^-]+', 1, 3) is not null;

只会更新旧值(至少)具有三个元素的行。

如果有两个元素,则两个更新的行为将有所不同-如果有任何元素,则第一个带有substr/instr的更新将始终占最后一个部分;带有rexexp_substr的第二个不会用破折号来更新一个。您只显示了一种固定模式,因此与您无关。至少,直到您再次对该数据运行相同的更新为止……