项目中用到了三个字段,需要对它们用concat()
函数进行拼接以及分组group by
,下面一锅端了concat()
的这个函数,有concat()
、concat_ws()
和 group_concat()
字段拼接的用法,我们来自己造点数据,做个测试。
1、准备一张test_concat
表
CREATE TABLE `test_concat` (
`id` int(11) NOT NULL,
`name` varchar(25) default NULL,
`age` int(5) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、插入一些数据
INSERT INTO test_concat (id, NAME, age)
VALUES
(1, 'andy', 18),
(1, 'bob', 20),
(2, 'jack', 33),
(2, NULL, 22),
(3, 'riemann', 28),
(3, 'riemann', 28),
(1, 'bob', 20)
3、执行sql
SELECT * FROM test_concat;
SELECT CONCAT(id,name,age) FROM test_concat;
出现了null值。。。
4、解决方式
SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat;
要是name字段的值是空字符串会怎么样呢?
继续往下看
这时候插入的时候换成了空字符串 ' '
INSERT INTO test_concat (id, NAME, age)
VALUES
(1, 'andy', 18),
(1, 'bob', 20),
(2, 'jack', 33),
(2, '', 22),
(3, 'riemann', 28),
(3, 'riemann', 28),
(1, 'bob', 20)
没有显示null,而是显示一片空白。
SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat;
SELECT CONCAT(id, CASE WHEN name = '' or name is NULL THEN '' ELSE name END, age) FROM test_concat;
其实这两种方法都可以,第二种更严谨一些。
使用函数CONCAT_WS()。使用语法为:CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。
第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
SELECT CONCAT_WS('-',id,name,age) FROM test_concat;
直接不需要判断为不为空,这种方式不会出现null值的情况!
GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]]
[SEPARATOR str_val])
在 MySQL 中,你可以得到表达式结合体的连结值。通过使用 DISTINCT 可以排除重复值。如果希望对结果中的值进行排序,可以使用 ORDER BY 子句。
SEPARATOR 是一个字符串值,它被用于插入到结果值中。缺省为一个逗号 (","),可以通过指定 SEPARATOR “” 完全地移除这个分隔符。
可以通过变量 group_concat_max_len 设置一个最大的长度。在运行时执行的句法如下: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;
如果最大长度被设置,结果值被剪切到这个最大长度。如果分组的字符过长,可以对系统参数进行设置:SET @@global.group_concat_max_len=40000;
使用示例:
SELECT id, GROUP_CONCAT(name) FROM test_concat WHERE id in('1', '2') GROUP BY id;
SELECT id, GROUP_CONCAT(distinct name ORDER BY name DESC SEPARATOR '_') FROM test_concat WHERE id in('1', '2') GROUP BY id;
SELECT id, GROUP_CONCAT(CONCAT_WS(', ',name,age) ORDER BY name DESC SEPARATOR '. ') FROM test_concat WHERE id in('1', '2') GROUP BY id;