GROUP_CONCAT 中的多个 COALESCE - 如果只有第一列不为空,则显示值

Multiple COALESCE in GROUP_CONCAT - is showing value if only first column isn't null

两个 table 的 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 移动到第一个位置,它会显示值。

这里是fiddle。 date 显示值,因为 sales.date 位于第一位,date1 returns 为空,因为 sales.date 位于第二位。

Sql Fiddle

我不确定这里只有 COALESCE 就足够了,正如@TimBiegeleisen 所说 - COALESCE 总是 returns 其列表中的第一个非 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

这不符合您的预期:

COALESCE(sales.date, ',', purchase.date)

COALESCE() returns 三个值中的第一个不是 NULL,所以你永远不会得到 purchase.date',' 永远不会 NULL.

你基本上想要:

GROUP_CONCAT(purchase.date, ',', sales.date) AS date

但是,您已经了解到 CONCAT() - 甚至这个隐式连接 - return NULL 如果任何值是 NULL。一种解决方案是个人 COALESCE() - 正如您的回答。我无法重现您的问题。 Here 是代码工作的示例。

或者,您可以使用 CONCAT_WS()(尽管您错过了分隔符):

GROUP_CONCAT(CONCAT_WS(',', sales.date, purchase.date))