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 不能显示为空的列的其他信息