2012-08-23 101 views
6

如果有任何列是NULL,如何使GROUPT_CONCAT返回NULL如果任何值为NULL,则GROUP_CONCAT返回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 
+2

+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

+0

酷感谢:)我有一种感觉,这将在大型数据集上表现非常糟糕。 – Petah

+0

刚看到你的更新,你知道哪个更好吗? – Petah

+0

@Petah:我必须测量它是肯定的。猜测第二个可能会更快一点,但我怀疑这两者都会有合理的表现。昂贵的部分可能是'GROUP_CONCAT'。 –