组\u concat中的multiple coalesce-将显示值

elcex8rz  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(313)

两张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

但第二列仍然显示null,尽管它有值。如果我搬家 sales.date 在第一个位置,它显示值。
这是小提琴。 date 显示值,因为sales.date位于第一位, date1 返回空,因为 sales.date 在第二个位置。
sql小提琴

a7qyws3x

a7qyws3x1#

这并不是您希望它做的:

COALESCE(sales.date, ',', purchase.date)
``` `COALESCE()` 返回三个值中第一个不是 `NULL` ,所以你永远不会得到 `purchase.date` :  `','` 永远不会 `NULL` .
你基本上想要:

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

然而,你已经学会了 `CONCAT()` --甚至这个隐式的连接——返回 `NULL` 如果任何值 `NULL` . 一个解决方案是单独的 `COALESCE()` --就像你的回答一样。我无法重现你的问题。下面是一个代码工作的示例。
或者,你可以用 `CONCAT_WS()` (尽管你错过了分隔符):

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

hs1rzwqc

hs1rzwqc2#

我不确定只是 COALESCE 这就足够了,正如@timbiegeleisen所说- COALESCE 始终返回其列表中的第一个非空值。所以我申请了 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

相关问题