【问题标题】:MySQL combine two columns and add into a new columnMySQL合并两列并添加到一个新列中
【发布时间】:2017-04-18 20:43:27
【问题描述】:

我的 MySQL 表结构如下:

+----------------+----------------+----------+
|    zipcode     |      city      |   state  |
+----------------+----------------+----------+
|     10954      |     Nanuet     |    NY    |
+----------------+----------------+----------+

我想将以上 3 列合并为一列,如下所示:

+---------------------+
|      combined       |
+---------------------+
| 10954 - Nanuet, NY  |
+---------------------+

并且我想在不破坏原始 3 个字段的情况下将这个“组合”列添加到表的末尾。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    创建列:

    ALTER TABLE yourtable ADD COLUMN combined VARCHAR(50);
    

    更新当前值:

    UPDATE yourtable SET combined = CONCAT(zipcode, ' - ', city, ', ', state);
    

    自动更新所有未来值:

    CREATE TRIGGER insert_trigger
    BEFORE INSERT ON yourtable
    FOR EACH ROW
    SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);
    
    CREATE TRIGGER update_trigger
    BEFORE UPDATE ON yourtable
    FOR EACH ROW
    SET new.combined = CONCAT(new.zipcode, ' - ', new.city, ', ', new.state);
    

    【讨论】:

    • 如何在更新中设置两个字段,我尝试添加另一个 set new.rowname 语句,但出现错误。
    • 我从记忆中开始,但我很确定你可以用逗号分隔要设置的值,例如:set new.foo = 1, new.bar = 2
    • 我想知道如果一个字段来自不同的表,即来自 table2 的城市怎么办??
    • 您可以在触发器的子查询中查询另一个表,例如set newLearn more….combined = (select city from foo where ...)。但是,在触发器中跨表构建依赖关系时应格外小心。这可能会导致一些非常讨厌的锁定问题,因为对一个表的任何更新都可能需要锁定多个其他表。在大多数情况下,您可以找到更好的方法,也许是更好地规范数据结构,或者将一些逻辑上推到应用程序代码中,而不是将其下推到数据库中。
    • 在大多数情况下,concat 动态数据似乎更优化,而不是创建一个新的列实例。请参阅 MikeTheReader 的回答。
    【解决方案2】:

    您确定要这样做吗?本质上,您正在复制三个原始列中的数据。从那时起,您需要确保组合字段中的数据与前三列中的数据相匹配。这会给您的应用程序带来更多开销,并且更新系统的其他进程将需要了解这种关系。

    如果您需要数据,为什么不在需要时选择?用于选择该字段中内容的 SQL 将是:

    SELECT CONCAT(zipcode, ' - ', city, ', ', state) FROM Table;
    

    这样,如果字段中的数据发生变化,您不必更新组合字段。

    【讨论】:

    • 我正在使用 AutoComplete 功能,我希望能够使用邮政编码和城市搜索 AutoComplete,这似乎是唯一简单的方法。至少,以我的知识水平。
    • 你的自动完成是否像:SELECT * from table where zipcode LIKE '%q% OR city LIKE '%q% or state LIKE '%q%
    • 这对我来说是最干净的。复制数据然后必须检查它们是否同步,并建立额外的逻辑来解决更高级别代码中的不同步问题似乎比简单地连接SELECT 甚至更好地使用应用程序连接它更脏。完全同意这个答案,尽管@squawknull 的答案在适当的时候引入了一个很酷的概念。
    【解决方案3】:

    向表中添加新列并执行查询:

    UPDATE tbl SET combined = CONCAT(zipcode, ' - ', city, ', ', state)
    

    【讨论】:

    • 我喜欢这个选项,因为它的性能优于存储。为了存储超过性能,您可以将 concat 添加到选择查询本身。触发代码见 squaknull 的帖子。
    【解决方案4】:

    从表中组合选择 CONCAT(邮政编码,'-',城市,',',州)

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 2022-07-21
      • 1970-01-01
      • 2014-06-26
      • 2020-03-30
      • 1970-01-01
      • 2014-05-09
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多