【问题标题】: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 以更好地了解如何实施我的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-13
        • 2021-12-07
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多