【问题标题】:Group_Concat in Concat not working with NULL valuesConcat 中的 Group_Concat 不能使用 NULL 值
【发布时间】: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 或必须在每个列上单独应用?

【问题讨论】:

标签: mysql group-concat


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2012-11-07
    • 2019-01-09
    • 2011-06-24
    • 2019-06-14
    • 2011-11-23
    • 2017-10-15
    相关资源
    最近更新 更多