在 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
如果您有很多列,我想您可以从系统目录生成语句以节省一些输入
我有 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
如果您有很多列,我想您可以从系统目录生成语句以节省一些输入