项目中用到了三个字段,需要对它们用concat() 函数进行拼接以及分组group by,下面一锅端了concat()的这个函数,有concat()、concat_ws()和 group_concat() 字段拼接的用法,我们来自己造点数据,做个测试。
1、准备一张test_concat表
1 2 3 4 5 |
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、插入一些数据
1 2 3 4 5 6 7 8 9 |
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
1 |
SELECT * FROM test_concat; |
1 |
SELECT CONCAT(id,name,age) FROM test_concat; |
出现了null值。。。
4、解决方式
1 |
SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat; |
要是name字段的值是空字符串会怎么样呢?
继续往下看
这时候插入的时候换成了空字符串 ' '
1 2 3 4 5 6 7 8 9 |
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,而是显示一片空白。
1 2 3 |
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)。
1 |
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;
使用示例:
1 |
SELECT id, GROUP_CONCAT(name) FROM test_concat WHERE id in('1', '2') GROUP BY id; |
1 |
SELECT id, GROUP_CONCAT(distinct name ORDER BY name DESC SEPARATOR '_') FROM test_concat WHERE id in('1', '2') GROUP BY id; |
1 |
SELECT id, GROUP_CONCAT(CONCAT_WS(', ',name,age) ORDER BY name DESC SEPARATOR '. ') FROM test_concat WHERE id in('1', '2') GROUP BY id; |