【问题标题】:Replace table column value using part of same column使用同一列的一部分替换表列值
【发布时间】:2019-10-17 03:27:40
【问题描述】:

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

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 );

【问题讨论】:

    标签: sql oracle oracle11g sql-update


    【解决方案1】:

    您并不遥远,但您的子查询不相关 - 子查询找到的值与正在更新的行之间没有链接,因此您可能遇到 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 的第二个不会用一个破折号更新一个。您只展示了一种固定模式,因此这些都可能与您无关。至少,在您对该数据再次运行相同的更新之前...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2019-08-08
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多