MySQL中CONCAT()函数出现值为空的问题及解决办法

项目中用到了三个字段,需要对它们用concat() 函数进行拼接以及分组group by,下面一锅端了concat()的这个函数,有concat()concat_ws()group_concat() 字段拼接的用法,我们来自己造点数据,做个测试。

一、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;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第1张图片

SELECT CONCAT(id,name,age) FROM test_concat;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第2张图片

出现了null值。。。

4、解决方式

SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第3张图片

要是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)

MySQL中CONCAT()函数出现值为空的问题及解决办法_第4张图片

没有显示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()。使用语法为: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;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第5张图片

直接不需要判断为不为空,这种方式不会出现null值的情况!

三、group_concat()

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;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第6张图片

SELECT id, GROUP_CONCAT(distinct name ORDER BY name DESC SEPARATOR '_') FROM test_concat WHERE id in('1', '2') GROUP BY id;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第7张图片

SELECT id, GROUP_CONCAT(CONCAT_WS(', ',name,age) ORDER BY name DESC SEPARATOR '. ') FROM test_concat WHERE id in('1', '2') GROUP BY id;

MySQL中CONCAT()函数出现值为空的问题及解决办法_第8张图片

你可能感兴趣的:(MySQL)