SQL Select; Объединять строки, избегая двойных запятых, где столбцы нулевые? - PullRequest
5 голосов
/ 26 ноября 2011

У меня есть следующие справочные данные.

PERSON_NAME                    STREET                   TOWN             COUNTY           POSTCODE   
------------------------------ ------------------------ ---------------- ---------------- ---------- 
David Smith                    30 Johnson Street        Norwich          Norfolk          NA38 3KL   
John Brown                     Douglas Road             Cambridge                         C8  9IJ    
Jackie White                   8 High Street            Ipswich          Suffolk          IP7  2YT   
Andrea Blue                    9 Marlborough Ave        Bury             Suffolk          IP4  0XC   
Jemima Green                   Riverside Walk           Colchester       Essex            CO6  7PR   
James Gray                     167 Hadleigh Place       London                            SW1 4TU  

Что я хочу сделать, это отобразить список имен людей вместе с их адресами, объединенными в строку через запятую.

Эта часть проста, я использовал || для конкатенации столбцов и размещения разделителей запятых.

Часть, над которой я спорю, это тот факт, что в некоторых строках ничего нет в спискедля COUNTY, поэтому мне нужно избегать отображения , ,.

Я провел некоторые исследования для себя и решил использовать SUBSTR в Oracle для замены двойных запятых,однако это чувствует себя немного "грязным".Есть ли более чистый способ сделать это, избегая использования сложных функций (таких как этот предыдущий вопрос SO )?

Вот что у меня есть:

SELECT
    SUPPNAME as "Supplier Name",
    REPLACE(STREET || ', ' || TOWN || ', ' || COUNTY || ', ' || POSTCODE, ' ,','') as "Supplier Address"
FROM
    SUPPLIERS
;

Спасибо

Ответы [ 3 ]

7 голосов
/ 26 ноября 2011

попробуй

SELECT
SUPPNAME AS "Supplier Name",
(
CASE WHEN STREET IS NULL THEN '' ELSE STREET || ', ' END || 
CASE WHEN TOWN IS NULL THEN '' ELSE TOWN || ', ' END ||
CASE WHEN COUNTY IS NULL THEN '' ELSE COUNTY || ', ' END || 
CASE WHEN POSTCODE IS NULL THEN '' ELSE POSTCODE END
) AS "Supplier Address"
FROM SUPPLIERS
3 голосов
/ 24 апреля 2015

В предыдущих ответах, если все поля равны NULL, вы получите только глупое ',' вместо ожидаемого NULL.Попробуйте этот подход, чтобы удалить один лишний ',' в начале результата

SELECT
SUPPNAME AS "Supplier Name",
SUBSTR(
    NVL2(STREET, ', ' || STREET, NULL)
        || NVL2(TOWN, ', ' || TOWN, NULL)
        || NVL2(COUNTY, ', ' || COUNTY, NULL)
        || NVL2(POSTCODE, ', ' || POSTCODE, NULL)
    ,2) AS "Supplier Address"
FROM SUPPLIERS
2 голосов
/ 26 ноября 2011

Вы можете использовать NVL2 вокруг полей, которые могут быть нулевыми, что-то вроде NVL2(county, county || ',', '')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...