GROUP_CONCAT中的多个COALESCE-如果仅第一列不为null,则显示值

时间:2019-01-06 05:07:30

标签: mysql sql group-concat

两个表的purchasesales的列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在第二位。

Sql Fiddle

2 个答案:

答案 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