2011-11-26 6 views
5

Mam następujące dane referencyjne.SQL Select; Łączenie łańcuchów, unikanie podwójnych przecinków, gdy kolumny są puste?

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 

Co chcę zrobić, to aby wyświetlić listę nazw osobowych, wraz z ich adresami łączone w ciąg oddzielonych przecinkami.

Ta część jest łatwa, użyłem || do łączenia kolumn i umieszczania separatorów przecinków.

Część, o której tu mowa, to fakt, że niektóre wiersze nie zawierają niczego na liście COUNTY, dlatego należy unikać wyświetlania , ,.

Zrobiłem kilka badań dla siebie i zdecydowałem się użyć SUBSTR w Oracle, aby zastąpić podwójne przecinki, jednak nie jest to "brudne". Czy jest to czystszy sposób, unikając stosowania złożonych funkcji (takich jak this previous SO question)?

To jest to, co mam:

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

Dzięki

Odpowiedz

7

próbują

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 
+2

Usunąłem moją odpowiedź, bo okazało się, że w Oracle smyczkowych concats znakiem null nie daje null (jak wierzę, że robi w SQL Server), tak jak wspomniałeś. Zacząłem przełączać się na opisy spraw, ale wtedy zobaczyłem twoją odpowiedź - +1 –

+0

+1. @Yahia - Właśnie uratowałeś mi ogromny ból głowy. Dzięki! –

2

Można użyć NVL2 wokół pól, które mogłyby być null, somthing jak NVL2(county, county || ',', '')

3

W poprzednie odpowiedzi, jeśli wszystkie plony są NULL, wtedy dostaniesz tylko głupie ", zamiast tego oczekiwano NULL. Spróbuj tej metody, aby usunąć jeden dodatkowy „” na początku wyniku

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 
+0

To działało idealnie dla mnie i uniknąłem przecinków. – user2710915

Powiązane problemy