Concat 中的 Group_Concat 不能使用 NULL 值

Posted

技术标签:

【中文标题】Concat 中的 Group_Concat 不能使用 NULL 值【英文标题】:Group_Concat in Concat not working with NULL values 【发布时间】:2012-09-21 03:29:26 【问题描述】:

我有一张桌子

CREATE TABLE IF NOT EXISTS `dept` (
  `did` int(11) NOT NULL,
  `dname` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `dept` (`did`, `dname`) VALUES
(1, 'Hi'),
(2, NULL),
(3, 'Hello');

那我有一个问题

select group_concat(concat(did,"','",dname) separator '),(') as Result from dept

生成结果为1','Hi'),('3','Hello

问题:我怎样才能得到上述查询的结果为1','Hi'),('2','NULL'),('3','Hello

它缺少具有 NULL 值的行,但我需要获取所有行

Link for SQL Fiddle Demo of question

更新:如果我有多个或所有列允许 NULL,有没有办法一次性应用 COALESCE 或必须在每个列上单独应用?

【问题讨论】:

我在 concat ***.com/questions/13451605/… 中有另一个 groupconcat 示例 【参考方案1】:

来自mysql aggregate function documentation:

除非另有说明,否则组函数会忽略 NULL 值。

使用COALESCE() 将空值替换为字符串,因为它们会被聚合函数消除。例如COALESCE(dbname, 'NULL') 如果dbname IS NULL 将返回字符串 NULL。它的目的是返回你给它的参数的第一个 non-null,因此可以返回一个默认值。

SELECT
  GROUP_CONCAT(CONCAT(did,"','", COALESCE(dname, 'NULL')) SEPARATOR "'),('") AS Result
FROM dept

【讨论】:

您的解决方案得到了很好的解释并且可以接受。请只需将分隔符 '),(' 替换为 "'),('",就像我在问题和 sqlfiddle 演示中所做的那样 @Sami 在上面编辑。您还可以转义单引号,如 '\'),(\''【参考方案2】:

试试这个,使用COALESCE

.., COALESCE(dname, 'NULL'),..

使其NULL 字符串可见。 SQLFIDDLE DEMO

【讨论】:

请指导如果两列或所有列都可以有 NULL 值,那么我是否必须对每列使用 COALESCE 或者有一些方法可以一次性完成? 很遗憾没有,您需要在每列上单独添加COALESCE【参考方案3】:

希望以下查询能达到您的目的

SELECT GROUP_CONCAT(
IF(dname IS NOT NULL, CONCAT(did,"','",dname), CONCAT(did,"','NULL")) 
SEPARATOR '),(') AS Result FROM dept

【讨论】:

以上是关于Concat 中的 Group_Concat 不能使用 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?

SQLite group_concat 返回相同数据的多个实例,不能使用 DISTINCT

group_concat 是不是有长度限制或它不能在文本字段上工作的其他原因

关于mysql group_concat 不能显示为空的列的其他信息

如何仅使用“group_concat”过滤表 mysql 中的行

mysql中的 group_concat