如果任何值为NULL,GROUP_CONCAT将返回NULL。

6

如何使GROUPT_CONCAT在任一列为NULL时返回NULL

这是一个测试表:

CREATE TABLE gc (
  a INT(11) NOT NULL,
  b VARCHAR(1) DEFAULT NULL
);

INSERT INTO gc (a, b) VALUES
(1, 'a'),
(1, 'b'),
(2, 'c'),
(2, NULL),
(3, 'e');

我的查询:

SELECT a, GROUP_CONCAT(b)
FROM gc
GROUP BY a;

这是我得到的内容:
a | GROUP_CONCAT(b)
--+----------------
1 | a,b
2 | c
3 | e

这是我想要的内容:
a | GROUP_CONCAT(b)
--+----------------
1 | a,b
2 | NULL
3 | e
1个回答

5
在一个IF表达式中,检查组内是否有任何值为NULL。我可以想到几种方法来实现这个目标:
1)计算非空值的数量并将其与组中行数进行比较:
SELECT a, IF(COUNT(b) = COUNT(*), GROUP_CONCAT(b), NULL) AS bs
FROM gc
GROUP BY a

在线查看演示:sqlfiddle

2) 使用 SUM 计算空值的数量:

SELECT a, IF(SUM(b IS NULL) = 0, GROUP_CONCAT(b), NULL) AS bs
FROM gc
GROUP BY a

请查看在线演示:sqlfiddle

太棒了,谢谢 :) 不过我感觉在大数据集上它的性能会很差。 - Petah
刚刚看到你的更新,你知道哪一个性能更好吗? - Petah
@Petah:我得测量一下才能确定。猜测第二个可能会快一点,但我怀疑两者都会有合理的性能。昂贵的部分可能是GROUP_CONCAT - Mark Byers

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