Управление нулевыми значениями в LISTAGG - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица политик и таблица клиентов. Для каждой политики у меня может быть много клиентов. Я хочу обернуть данные клиентов в одну запись, сгруппированную по 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      |
+----------+-----------+

Есть ли способ предотвратить это, кроме использования NVL или чего-либо подобного в каждом поле LISTAGG?

Может быть, к этому есть совершенно другой подход?

Спасибо вам в аванс для чтения.

1 Ответ

3 голосов
/ 31 марта 2020

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

Если у вас много столбцов, я думаю, вы могли бы сгенерировать ваши выписки из системного каталога, чтобы сэкономить набрав

...