我想要选择两个字段的串联,但它们之间要有分隔符。只有当两个操作数都不为空时,才应该有分隔符。
因此,对于具有a='foo', b=NULL, c='bar'
的记录,我希望得到结果abc='foo;bar'
(而不是'foo;;bar'
)。
我希望有一个像concat_sep(a, b, ';')
这样的函数,如果a和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)
但正如您所看到的,这段代码很快就会变得很麻烦,特别是当您有3个以上的列,并且您为它们指定了合理的名称,而不是a、b和c。;-)
我找不到一种更短、更容易或更易读的方法,但我想在完全放弃之前(或者自己浪费时间编写这样的函数),我应该在这里问问。
4条答案
按热度按时间ukqbszuj1#
我知道你用的是10g,所以这不管用。但是为了完整性,
LISTAGG()
“正确”地处理NULL
值。不过,要做到这一点,你必须更新到11g2:或者更简洁一点,如果您想列出表中的列:
或在实际的table上:
现在我不确定这是否比您的原始示例更好(更具可读性):-)
5rgfhyps2#
rta7y2nd3#
AFAIK,没有简明的方法可以做到这一点。
在过去,我曾求助于
但这并不比你的例子更好。
w9apscun4#
Not all fields will have data sequentially. This is for fields that are blank and without spaces:
You can get creative with this until Oracle gives a function to do this.
Code snippet: