Я хочу выбрать конкатенацию нескольких полей, но с разделителем между ними. Разделитель должен присутствовать только в том случае, если оба операнда не являются нулевыми.
Итак, для записи с a='foo', b=NULL, c='bar'
, я хочу получить результат abc='foo;bar'
(not 'foo;;bar'
).
Я хотел бы иметь такую функцию, как concat_sep(a, b, ';')
, которая добавляет только ';' inbetween, если оба и и b не являются нулевыми.
Конечно, я могу использовать nvl2 следующим образом:
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)
Но, как вы можете видеть, этот код скоро становится засоренным, особенно когда вы получили более трех столбцов, и вы дали им разумные имена вместо a, b и c.; -)
Я не мог найти более короткий, легкий или более читаемый способ, но я думал, что попрошу здесь, прежде чем полностью отказаться (или тратить время на создание такой функции).