更新列并从更新的 col 更新另一个 col

Posted

技术标签:

【中文标题】更新列并从更新的 col 更新另一个 col【英文标题】:update column and update another col from updated col 【发布时间】:2020-03-05 09:38:07 【问题描述】:

这是一个可行的解决方案吗?

BEGIN

 UPDATE my_table 
 SET my_column = my_value
 WHERE my_conditions,
       my_column2 = my_column --my_updated_column_value

COMMIT;
END;

或者如何更新具有相同值的多个列?

【问题讨论】:

【参考方案1】:

那就是

update my_table 
  set my_column  = my_value,
      my_column2 = my_value      --> this
    where my_conditions;

因为,如果您将其设置(如答案之一所示)为

my_column2 = my_column

您会将MY_COLUMN2 更新为 MY_COLUMN 的值。看看:

SQL> create table test
  2  (my_column number,
  3   my_column2 number
  4  );

Table created.

SQL> insert into test values (100, 200);

1 row created.

SQL> update test set 
  2    my_column = 300,           --> "300" represents "MY_VALUE"
  3    my_column2 = my_column;    --> it won't be set to 300, but to 100

1 row updated.

SQL> select * from test;

 MY_COLUMN MY_COLUMN2
---------- ----------
       300        100

SQL>

【讨论】:

【参考方案2】:

只需将更新放在语句的“设置”部分

begin
 update my_table 
    set my_column   = my_value
       ,my_column2 = my_column --my_updated_column_value
  where my_conditions
commit;
end;

【讨论】:

并非如此。这样做,您会将 MY_COLUMN2 设置为 old MY_COLUMN 的值,这不是 OP 想要的(至少,我相信如此)。 你是对的,我误读了问题 theel op 想要在一个更新语句中设置多个列而不是两个单独的更新语句 - 每列一个【参考方案3】:

您可以在一个语句中直接更新 2 个字段。这是一个例子。

drop table TAB1\\

create table TAB1  
(Col1 CHAR(1), 
 COl2 CHAR(1)
)\\



INSERT INTO TAB1 VALUES ( 'A' , 'B' ) \\
INSERT INTO TAB1 VALUES ( 'C' , 'D' ) \\

select * from TAB1\\

UPDATE TAB1  
SET 
COL1 = 'E',
COL2 = 'E'
WHERE COL1 = 'A' \\

SELECT * FROM TAB1\\

结果

    COL1    COL2
1   A   B
2   C   D

    COL1    COL2
1   E   E
2   C   D

Demo

【讨论】:

以上是关于更新列并从更新的 col 更新另一个 col的主要内容,如果未能解决你的问题,请参考以下文章

MySQL AFTER 更新触发器与 New.col<> OLD.col

sql将一个表中的所有数据更新到另一个表中

从一个表更新另一个表

基于其他两列并使用 LAG 函数更新 Oracle 过程中的列

使用返回值更新列

PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值