いくつかのフィールドの連結を選択したいのですが、それらの間にセパレーターがあります。セパレータは、両方のオペランドが null でない場合にのみ存在する必要があります。
したがって、 のレコードa='foo', b=NULL, c='bar'
の場合、結果を取得したいabc='foo;bar'
( ではありません'foo;;bar'
)。
concat_sep(a, b, ';')
「;」のみを追加するような関数が必要です a と b の両方が null でない場合は、中間。
もちろん、次のように 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)
しかし、ご覧のとおり、このコードはすぐに詰まります。特に 3 つ以上の列があり、a、b、c の代わりに適切な名前を付けた場合は特にそうです。;-)
より短く、より簡単で、より読みやすい方法を見つけることができませんでしたが、完全にあきらめる前に (またはそのような関数を自分で書くのに時間を無駄にする前に) ここで質問したいと思いました。