2011-04-25 221 views
41

我有一个MySQL表的结构如下:MySQL的合并两列,并添加到一个新的列

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

我想上述3列合并成一列这样的:

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

我想将此“组合”列添加到表格的末尾而不破坏原始3个字段。

回答

115

创建柱:

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); 
+15

+1为触发器 – MikeTheReader 2011-04-25 02:06:22

+0

如何在更新上设置两个字段,我尝试添加另一个set new.rowname语句,但只是出现错误。 – LukeS 2013-03-07 23:08:58

+0

我从这里回忆,但我敢肯定,你可以分开的值设置逗号,如:set new.foo = 1,new.bar = 2 – squawknull 2013-03-08 03:37:04

12

添加新列到表,并借此在查询:

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

我喜欢这个选项,因为它的性能优于存储。对于性能上的存储,您可以将concat添加到select查询本身。请参阅squaknull的帖子,了解触发器代码。 – adorablepuppy 2011-04-25 02:02:15

22

您确定要这么做吗?实质上,您正在复制三个原始列中的数据。从这一点开始,您需要确保组合字段中的数据与前三列中的数据匹配。这对你的应用程序来说是更多的开销,而更新系统的其他进程需要理解这种关系。

如果您需要这些数据,为什么不在需要时选择?选择这将是在这一领域将是SQL:

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

这样,如果在田里的数据发生变化,不必更新您的合并域。

+0

我使用的是自动完成功能,我希望能够在邮政编码和城市中搜索自动完成功能,这似乎是唯一简单的方法。至少,以我的知识水平。 – stewart715 2011-04-25 02:04:23

+1

做你的自动完成如:**选择*从表中的邮政编码喜欢'%q%或城市喜欢'%q%或国家喜欢'%q%** – 2013-01-15 20:10:41

+0

这感觉对我来说最干净。复制数据然后必须检查它们是否同步,并且在更高级别的代码中创建额外的逻辑以解决不同步问题似乎比简单地使用“SELECT”进行连接更加肮脏,或者甚至更好地使用应用程序来连接它。不能同意这个答案,尽管@ squawknull的答案在适当的地方引入了一个很酷的概念。 – mrClean 2016-12-06 20:44:39

0

SELECT CONCAT(邮编, ' - ',城市,',',州)由表