在 LISTAGG 中管理空值

Manage null values in LISTAGG

我有 table 个政策和 table 个客户。对于每项政策,我可以有很多客户。我想要做的是将客户数据包装在一个按 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 字符串中检索到的整个值也会变为空。因此,如果我有如下客户 table:

+----+----------+------+------------+-------+
| 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 或类似方法之外,还有什么可以防止这种情况发生的吗?

也许对此有完全不同的方法?

提前感谢您的阅读。

合并是唯一的方法。

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

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