GROUP_CONCAT 中的多个 COALESCE - 如果只有第一列不为空,则显示值
Multiple COALESCE in GROUP_CONCAT - is showing value if only first column isn't null
两个 table 的 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
移动到第一个位置,它会显示值。
这里是fiddle。 date
显示值,因为 sales.date 位于第一位,date1
returns 为空,因为 sales.date
位于第二位。
我不确定这里只有 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))
两个 table 的 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
移动到第一个位置,它会显示值。
这里是fiddle。 date
显示值,因为 sales.date 位于第一位,date1
returns 为空,因为 sales.date
位于第二位。
我不确定这里只有 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))