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

jal*_*oly 7 oracle string-concatenation oracle11g sql-update

我有一个包含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
Run Code Online (Sandbox Code Playgroud)

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

Boh*_*ian 13

使用concatentation运算符||:

update mytable set
c = a || '_' || b
Run Code Online (Sandbox Code Playgroud)

或者更好的是,每当插入或更新行时都要避免重新运行:

create view myview as
select *, a || '_' || b as c
from mytable
Run Code Online (Sandbox Code Playgroud)


Lal*_*r B 6

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

无论如何,

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

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

就像是,

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

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

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