sql - 使用同一列的一部分替换表列值
问题描述
我正在更新表中的一列,将一列替换为其现有值的一部分:
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 );
解决方案
您离得不远,但您的子查询不相关 - 子查询找到的值与正在更新的行之间没有链接,因此您可能会收到 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
不会用一个破折号更新一个。您只展示了一种固定模式,因此这些都可能与您无关。至少,直到您再次针对该数据运行相同的更新...
推荐阅读
- javascript - 如何改进这个 JS 代码看起来更优雅
- html - align-items:stretch 和 align-self:stretch 在没有固定高度的 flex 行中不起作用
- etl - Pentaho Data Integration 8.2 - Excel Writer 上的时间戳空白
- python-requests - 如何使用 Requests 库和 Python 3.8.5 禁用“check_hostname”?
- node.js - 使用 nodejs 将图像更新到 AWS S3
- python - 快速排序返回错误的顺序
- python - 如何从用户输入中捕获矩阵并在用户输入时将其打印出来?
- angular - WebStorm 断点在 Angular 8 和 9 升级后没有暂停
- pact - 依赖于先前请求的响应的 Pact 请求
- google-cloud-platform - 如何保证多个 GCP 云内存存储实例之间的一致性?