如何使用同一个表中的另外两列的连接更新列

时间:2015-02-16 13:31:28

标签: oracle oracle11g sql-update string-concatenation

我有一个包含3列a,b和c的表。我想知道如何使用每行中另外两列的连接来更新第三列的值。

before update
 A    B    c 
-------------
1     4
2     5
3     6

after update
 A    B    c 
-------------
1     4    1_4
2     5    2_5
3     6    3_6

我怎样才能在oracle中这样做?

2 个答案:

答案 0 :(得分:13)

使用连接运算符||

update mytable set
c = a || '_' || b

或者更好的是,为了避免在插入或更新行时重新运行它:

create view myview as
select *, a || '_' || b as c
from mytable

答案 1 :(得分:6)

首先,您违反了规范化的规则。你必须重新考虑设计。如果您有表格列中的值,那么要获得计算值,您只需要选择语句来获取您想要的结果。存储计算值通常是一个坏主意,并被认为是一个糟糕的设计。

反正

由于你在11g,如果你真的想要一个计算列,那么我会建议 VIRTUAL COLUMN 而不是手动更新列。 UPDATE 语句涉及很多开销。使用虚拟列可以减少大量开销。此外,您将完全摆脱手动工作和那些代码行来进行更新。 Oracle为您完成工作。

当然,您将在虚拟列子句中使用相同的连接条件。

类似的东西,

Column_c varchar2(50) GENERATED ALWAYS AS (column_a||'_'||column_b) VIRTUAL

注意:对其使用有一定的限制。因此,请在实施之前参考文档。但是,对于OP提供的简单用例,虚拟列是直接适合的。

更新我做了一个小测试。几乎没有观察到。请阅读此question以更好地了解如何实施我的建议。