我正在更新表中的一列,用其现有值的一部分替换一列:
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 );
答案 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
的第二个不会用破折号来更新一个。您只显示了一种固定模式,因此与您无关。至少,直到您再次对该数据运行相同的更新为止……