在Concat函数中使用Group_Concat无法处理NULL值

8
我有一张表格。
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值的行,但我需要获取所有行。

问题的SQL Fiddle演示链接

更新:如果我有多个或所有允许NULL的列,是否有一种方法可以为所有列应用COALESCE,还是必须在每个列上单独应用?


我有另一个在concat中使用groupconcat的例子。https://dev59.com/l2Yr5IYBdhLWcg3wuMb9#13451984 - Sami
3个回答

9

试试这个,使用COALESCE

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

使“NULL”字符串可见。 SQLFIDDLE DEMO

如果两个或所有列都可以有NULL值,那么我是否必须对每列使用COALESCE函数,还是有一种方法可以一次性处理所有列? - Sami
不幸的是,你需要在每个列上单独添加“COALESCE”。 - John Woo

2
MySQL聚合函数文档中得知:
除非另有说明,否则分组函数会忽略NULL值。
使用COALESCE()将null替换为字符串,因为它们会被聚合函数消除。例如COALESCE(dbname, 'NULL')将返回字符串NULL如果dbname IS NULL。它的目的是返回您给定的参数的第一个非空值,并因此可以返回默认值。
SELECT
  GROUP_CONCAT(CONCAT(did,"','", COALESCE(dname, 'NULL')) SEPARATOR "'),('") AS Result
FROM dept

你的解决方案已经很好地解释和可接受。请将分隔符'),('替换为我在问题和sqlfiddle演示中所做的"'),('" - Sami
@Sami编辑了上面的内容。您也可以像'\'),(\''一样转义单引号。 - Michael Berkowski

0
希望以下查询能够满足您的需求。
SELECT GROUP_CONCAT(
IF(dname IS NOT NULL, CONCAT(did,"','",dname), CONCAT(did,"','NULL")) 
SEPARATOR '),(') AS Result FROM dept

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接