GROUP_CONCAT用分隔符拉出空结果
问题描述:
昨天我问了一个问题,关于如何将多个结果放入一个字段并给出了答案GROUP_CONTACT()
。GROUP_CONCAT用分隔符拉出空结果
我已经把它放到我的代码中,它工作正常。我需要为两个字段执行此操作,因此我现在已经开始在同一个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()
会忽略空的结果,但我需要做些什么来阻止GROUP_CONTACT()
显示一个空的逗号分隔列表,当它只是""
而不是NULL
。
答
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
答
试试这个:
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
答
您是否尝试过使用GROUP_CONCAT(DISTINCT column)
?根据我对文档的理解,它应该会像你想要的那样产生一个空字符串。
DISTINCT
将消除所有重复项,只有一次发生""
。
答
您还可以使用NULLIF()
功能为空字符串转换为空值:
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
;