MySQL中的GROUP_CONCAT函数如何处理Null值

44

有没有办法使MySQL的Group_Concat函数包含null值?

考虑以下来自我的源表的示例:

userId, questionId, selectionId
7, 3, NULL
7, 4, 1
7, 5, 2

当我使用GROUP_CONCAT查询选择表时,我会得到以下结果:

7, 4=1,5=2

我想要获取以下内容:

7, 3=NULL,4=1,5=2

供参考,我的查询看起来像这样:

Select userId, GROUP_CONCAT(CONCAT(questionId, '=', selectionId))
From selection
Group by userId;

我也尝试添加了一个类似这样的IFNULL:

Select userId, GROUP_CONCAT(IFNULL(CONCAT(questionId, '=', selectionId), 'NULL'))
From selection
Group by userId;

但是这样产生了以下结果:

7, NULL,4=1,5=2

注意 - 我忘记了另一个复杂性。selectionId 是指向另一个表的外键。我使用左外连接到 selection_text 表。我的实际查询包括来自该表的字段(由于 selectionId 为空,这些字段解析为 NULL)。


生成了应该有的结果,请在selectionId上尝试使用IFNULL,而不是在CONCAT上使用。 - piotrm
但一般来说,避免使用Group Concat! - IcedDante
@IcedDante 你能详细说明为什么吗? - LukasKroess
我不应该过于简单粗暴地反对它。在许多情况下,它是完全正常的。但是,如果在生产环境中用于从具有xToMany关系的多个表中获取数据,则可能会掩盖复杂性并导致低效的查询。 - IcedDante
2个回答

65

你应该只是使用IFNULL函数对可能为NULL的列进行处理;

SELECT userId, GROUP_CONCAT(CONCAT(questionId, '=', 
                 IFNULL(selectionId, 'NULL')))
FROM selection
GROUP BY userId;

这里有一个演示.


刚遇到了这个问题,太棒的答案!我今天学到了新知识 :) - b3tac0d3

7

您应该直接使用IFNULLCOALESCE函数处理selectionId的值:

SELECT
  userId,
  GROUP_CONCAT(CONCAT(questionId, '=', COALESCE(selectionId, 'NULL')))
FROM selection
GROUP BY userId;

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