两个表的purchase
和sales
的列date
列已串联为date
行。
GROUP_CONCAT(purchase.date,',',sales.date) AS date
但是根据数据输入,它们两个都可以为空白。 所以我串联为
GROUP_CONCAT(COALESCE(purchase.date,''),',',COALESCE(sales.date,''))AS date
在这里,为什么如果purchase.date
为空并且sales.date
有值,为什么sales.date
列也被获取为空?但是对于purchase.date
,即使sales.date
为空,也会显示值。
我的意思是我的代码不适用于GROUP_CONCAT
的第二列。仅在第一列不为空时显示第二列的值。
我尝试过
GROUP_CONCAT(COALESCE(purchase.date,',',sales.date),'')AS date
GROUP_CONCAT(COALESCE(purchase.date,',',sales.date,'')AS date
,但第二列仍显示为空,尽管它具有值。如果我将sales.date
移动到第一位置,它将显示值。
这里是小提琴。 date
之所以显示价值,是因为sales.date在第一位,date1
返回空是因为sales.date
在第二位。
答案 0 :(得分:1)
这并没有按照您的意愿执行:
COALESCE(sales.date, ',', purchase.date)
COALESCE()
返回三个不是NULL
的值中的第一个,因此您将永远不会获得purchase.date
:','
永远不会是NULL
。
您基本上想要:
GROUP_CONCAT(purchase.date, ',', sales.date) AS date
但是,您了解到CONCAT()
-甚至是这个隐式连接-如果任何值为NULL
都返回NULL
。一种解决方案是单独的COALESCE()
-如您的回答。我无法重现您的问题。 Here是代码正常工作的示例。
或者,您可以使用CONCAT_WS()
(尽管您错过了分隔符):
GROUP_CONCAT(CONCAT_WS(',', sales.date, purchase.date))
答案 1 :(得分:0)
我不确定这里仅COALESCE
就足够了,因为@TimBiegeleisen说-COALESCE
始终返回其列表中的第一个非NULL值。所以我应用了CASE
条件
CASE
WHEN purchase.date IS NULL THEN GROUP_CONCAT(COALESCE(sales.date,''))
WHEN sales.date IS NULL THEN GROUP_CONCAT(COALESCE(purchase.date,''))
WHEN purchase.date !='' AND sales.date !='' THEN GROUP_CONCAT(COALESCE(purchase.date,',',sales.date),'')
END AS date1