【问题标题】:Manage null values in LISTAGG管理 LISTAGG 中的空值
【发布时间】:2020-03-31 03:04:58
【问题描述】:

我有一张政策表和一张客户表。对于每项政策,我可以有很多客户。我想要做的是将客户数据包装在一个按 PolicyId 分组的记录中。

这是我的查询:

SELECT p.Id AS POLICY, LISTAGG(c.Name || ',' || c.Address || ',' || c.Phone || '||') AS CUSTOMERS
FROM Policies p
INNER JOIN Customers c ON c.PolicyId = p.Id
WHERE p.Id = 'AXSD1234'
GROUP BY p.Id

我遇到的问题是,如果客户字段之一为空,则在 CUSTOMERS 字符串中检索到的整个值也变为空。因此,如果我有一个如下所示的客户表:

+----+----------+------+------------+-------+
| Id | PolicyId | Name |  Address   | Phone |
+----+----------+------+------------+-------+
|  1 | AXSD1234 | Jhon | Street 123 |  1234 |
|  2 | AXSD1234 | Anna | NULL       |  2345 |
+----+----------+------+------------+-------+

我希望检索到这样的东西:

+----------+------------------------------------+
|  POLICY  |            CUSTOMERS               |
+----------+------------------------------------+
| AXSD1234 | John,Street 123,1234||Anna,,2345|| |
+----------+------------------------------------+

但是我得到了这个:

+----------+-----------+
|  POLICY  | CUSTOMERS |
+----------+-----------+
| AXSD1234 | NULL      |
+----------+-----------+

除了在 LISTAGG 的每个字段上使用 NVL 等之外,还有什么方法可以防止这种情况发生吗?

也许有一种完全不同的方法?

提前感谢您的阅读。

【问题讨论】:

  • Coalesce(或 NVL)是解决这个问题的方法。那么是什么限制了你以这种方式使用它呢?
  • 我只是想知道是否有一种方法可以做到这一点,而不必单独检查每个字段,因为实际查询在不同的 LISTAGG 中具有大量字段,并且周围有各种类型。但是,是的,我认为这是唯一的选择。谢谢你的回答!

标签: database db2 listagg


【解决方案1】:

COALESCE 是唯一的方法。

SELECT p.Id AS POLICY, LISTAGG(COALESCE(c.Name,'') || ',' || COALESCE(c.Address) || ',' || COALESCE(c.Phone) || '||') AS CUSTOMERS
FROM Policies p
INNER JOIN Customers c ON c.PolicyId = p.Id
WHERE p.Id = 'AXSD1234'
GROUP BY p.Id

如果您有很多列,我想您可以从系统目录生成语句以节省一些输入

【讨论】:

  • 正确的 asnwer 是这样。谢谢。
猜你喜欢
  • 2016-06-27
  • 2021-05-27
  • 2019-09-16
  • 2021-06-03
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
相关资源
最近更新 更多