Chcę wybrać konkatenację kilku pól, ale z separatorem między nimi. Separator powinien być tam, tylko jeśli oba argumenty nie są puste.Oracle: Concat with delimiter, ale tylko wtedy, gdy oba operandy NIE są NULL
Tak więc dla rekordu z a='foo', b=NULL, c='bar'
, chcę uzyskać wynik abc='foo;bar'
(nie 'foo;;bar'
).
Chciałbym mieć funkcję taką jak concat_sep(a, b, ';')
, która dodaje tylko ";" pośrednie, jeśli zarówno a, jak i b nie są zerowe.
Oczywiście, można użyć nvl2 tak:
select
a, b, c,
substr(abc, 1, length(abc) - 1) as abc
from
(select
a, b, c,
nvl2(a, a || ';', '') || nvl2(b, b || ';', '') || nvl2(c, c || ';', '') as abc
from
Table1)
Ale jak widać, ten kod staje się lepki szybko, zwłaszcza, gdy masz więcej niż 3 kolumny i dałeś im nazwy sensowne zamiast a, b i c. ;-)
Nie mogłem znaleźć krótszego, łatwiejszego ani bardziej czytelnego sposobu, ale pomyślałem, że zapytam tutaj, zanim całkowicie zrezygnuję (lub tracę czas na pisanie takiej funkcji).
wydaje się bardzo specyficznej logiki y chcesz: dlaczego pisanie własnej funkcji byłoby stratą czasu? – tbone
Byłoby, gdyby okazało się, że już istnieje. :) – GolezTrol
bez listy 11g wygląda na to, że będziesz musiał napisać własną. I patrząc na twoje komentarze, wydaje się, że napisałeś swój własny, więc jestem zdezorientowany, czy szukasz jakiejś funkcjonalności, której nie zapewnia twoja własna funkcja? Może przykład użycia, aby zobaczyć, jak zamierzasz użyć tego (mogę wymyślić kilka podejść) – tbone