MySQL字符串连接函数
一、CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
select concat(s_id, "--", s_bar_code) from `t_storage_order_detail` WHERE `s_sn` LIKE '%R2016091200002%' LIMIT 0, 1000; +--------------------------------+ | concat(s_id, "--", s_bar_code) | +--------------------------------+ | 204--6930000003111 | | 205--6930000003128 | | 206--6930000003135 | | 207--6930000003142 | | 208--6930000003159 | | 209--6930000003166 | | 210--6930000003173 | | 211--6930000003180 | | 212--6930000003197 | | 213--6930000003203 | | 214--6930000003210 | | 215--6930000003227 | +--------------------------------+
二、MySQL中 concat_ws 函数
使用方法:
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
mysql> select concat_ws("--",s_id,s_bar_code) from `t_storage_order_detail` WHERE `s_sn` LIKE '%R2016091200002%' LIMIT 0, 1000; +---------------------------------+ | concat_ws("--",s_id,s_bar_code) | +---------------------------------+ | 204--6930000003111 | | 205--6930000003128 | | 206--6930000003135 | | 207--6930000003142 | | 208--6930000003159 | | 209--6930000003166 | | 210--6930000003173 | | 211--6930000003180 | | 212--6930000003197 | | 213--6930000003203 | +---------------------------------+ 28 rows in set
三、MySQL中 group_concat 函数
完整的语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) mysql> select group_concat("'",s_bar_code,"'") from `t_storage_order_detail` WHERE `s_sn` LIKE '%R2016091200002%' LIMIT 0, 1000; +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | group_concat("'",s_bar_code,"'") | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | '6930000003111','6930000003128','6930000003135','6930000003142','6930000003159','6930000003166','6930000003173','6930000003180','6930000003197','6930000003203','6930000003210','6930000003227','6930000003234','6930000003241','6930000003258','6930000003265','6930000003272','6930000003289','6930000003296','6930000003302','6930000003319','6930000003326','6930000003333','6930000003340','6930000003357','6930000003364','6930000003371','6930000003388' | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
基本查询
mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,逗号分隔(默认)
mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.00 sec)
以id分组,把name字段的值打印在一行,分号分隔
mysql> select id,group_concat(name separator ';') from aa group by id; +------+----------------------------------+ | id| group_concat(name separator ';') | +------+----------------------------------+ |1 | 10;20;20 | |2 | 20| |3 | 200;500 | +------+----------------------------------+ 3 rows in set (0.00 sec)
以id分组,把去冗余的name字段的值打印在一行,
逗号分隔
mysql> select id,group_concat(distinct name) from aa group by id; +------+-----------------------------+ | id| group_concat(distinct name) | +------+-----------------------------+ |1 | 10,20| |2 | 20 | |3 | 200,500 | +------+-----------------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序 mysql> select id,group_concat(name order by name desc) from aa group by id; +------+---------------------------------------+ | id| group_concat(name order by name desc) | +------+---------------------------------------+ |1 | 20,20,10 | |2 | 20| |3 | 500,200| +------+---------------------------------------+ 3 rows in set (0.00 sec)
1.int字段的连接陷阱 当你用group_concat的时候请注意,连接起来的字段如果是int型,
一定要转换成char再拼起来, 否则在你执行后(ExecuteScalar或者其它任何执行SQL返回结果的方法)返回的将不是一个逗号隔开的串, 而是byte[]。
该问题当你在SQLyog等一些工具中是体现不出来的,所以很难发现。
select group_concat(ipaddress) from t_ip 返回逗号隔开的串 select group_concat(id) from t_ip 返回byte[] select group_concat(CAST(id as char)) from t_dep 返回逗号隔开的串 select group_concat(Convert(id , char)) from t_dep 返回逗号隔开的串
附Cast,convert的用法:
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。 这个类型 可以是以下值其中的 一个: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER]
2.长度陷阱 用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下。
使用group_concat_max_len系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val 是一个无符号整数: SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。 在SQLyog中执行 SET GLOBAL group_concat_max_len = 10 后,
重新打开SQLyog,设置就会生效。