GROUP_CONCAT使用分隔符返回空结果

9

昨天我问了一个问题,关于如何将多个结果合并到一个字段中,并得到了答案GROUP_CONTACT()

我已经将其放入我的代码中,它可以正常工作。现在我需要对两个字段进行操作,因此我在同一个sql语句中使用了两次。不幸的是,第二个字段返回了一个带有逗号的空列表,我不太确定原因。

这是我的样本产品数据:

pid || prod
1   || top
2   || sweater

这是我的样例股票数据(一些股票没有两个尺寸,例如腰围和胸围):

sid || size1 || size2 || pid
1   || M     ||       || 1
2   || L     ||       || 1
3   || XL    ||       || 1
4   || L     ||       || 2
5   || XL    ||       || 2

这是我的代码:
SELECT p.id, GROUP_CONCAT(s.size1) size1, GROUP_CONCAT(s.size2) size2, p.prod
FROM products p JOIN stock s ON s.prodid = p.id

这是它应该带来的效果:
pid || size1  || size2 || prod
1   || M,L,XL ||       || top
2   || L,XL   ||       || sweater

这是它实际展现出的内容:
pid || size1  || size2 || prod
1   || M,L,XL || ,,    || top
2   || L,XL   || ,     || sweater

我已经检查过size2中是否有空格或其他内容,但是里面什么都没有。

我运行了这个查询,产品返回的结果与我预期的一样:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 = ""

当我执行这个查询时,没有返回任何结果:
SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 IS NULL

我知道GROUP_CONCAT()会忽略NULL结果,但我需要做些什么来阻止GROUP_CONTACT()在只有""而不是NULL的情况下显示一个空逗号分隔列表。
5个回答

24
SELECT p.id, GROUP_CONCAT(s.size1) size1, 
GROUP_CONCAT(if (s.size2 ='', null, s.size2)) as size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id

8

您还可以使用NULLIF()函数将空字符串转换为NULL值:

SELECT
  p.id,
  GROUP_CONCAT(       s.size1     ) AS size1,
  GROUP_CONCAT(NULLIF(s.size2, '')) AS size2,
  p.prod
FROM products AS p
  INNER JOIN stock AS s ON s.prodid = p.id
GROUP BY
  p.id,
  p.prod
;

4

试试这个:

SELECT 
    p.id, 
   GROUP_CONCAT(s.size1) size1, 
   GROUP_CONCAT(case when s.size2='' then null else s.size2 end) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id

0
你尝试使用过GROUP_CONCAT(DISTINCT column)吗?根据我理解文档,它应该会产生一个空字符串,就像你想要的一样。 DISTINCT将消除所有重复项,只留下一个""的出现。

0

如果使用NULLIF:

GROUP_CONCAT(NULLIF(au1.email,''),',')

记得不要放置分隔符(从GROUP_CONCAT函数中删除第二个参数):

GROUP_CONCAT(NULLIF(au1.email,''))

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