【问题标题】:How to update a column with concatenate of two other column in a same table如何更新与同一个表中其他两个列的连接的列
【发布时间】:2015-02-16 13:31:27
【问题描述】:
我有一个包含 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 中做到这一点?
【问题讨论】:
标签:
oracle
oracle11g
sql-update
string-concatenation
【解决方案1】:
使用连接运算符||:
update mytable set
c = a || '_' || b
或者更好的是,避免在插入或更新行时重新运行:
create view myview as
select *, a || '_' || b as c
from mytable
【解决方案2】:
首先,你违反了规范化的规则。您必须重新考虑设计。如果您在表列中有值,那么要获得计算值,您只需要一个 select 语句以您想要的方式获取结果。存储计算值通常是一个坏主意,被认为是一个糟糕的设计。
不管怎样,
既然你在11g,如果你真的想要一个计算列,那么我建议虚拟列而不是手动更新列。 UPDATE 语句涉及很多开销。使用虚拟列会减少很多开销。此外,您将完全摆脱手动工作和执行更新的那些代码行。 Oracle 为您完成这项工作。
当然,您将在虚拟列子句中使用相同的连接条件。
类似的,
Column_c varchar2(50) GENERATED ALWAYS AS (column_a||'_'||column_b) VIRTUAL
注意:对其使用有一定的限制。因此,请在实施之前参考文档。但是,对于 OP 提供的简单用例,虚拟列是很合适的。
更新我做了一个小测试。几乎没有观察到。请阅读此question 以更好地了解如何实施我的建议。