Sql 将字段合并为一列
我有以下数据集:Sql 将字段合并为一列,sql,oracle,Sql,Oracle,我有以下数据集: user_id | advr1_id | advr1_name | advr2_id | advr2_name | advr3_id | advr3_name --------+----------+------------+----------+------------+----------+----------- 7 | 22 | John Smith | 15 | Jane Doe | 9 | Bill Clint
user_id | advr1_id | advr1_name | advr2_id | advr2_name | advr3_id | advr3_name
--------+----------+------------+----------+------------+----------+-----------
7 | 22 | John Smith | 15 | Jane Doe | 9 | Bill Clint
8 | 15 | Jane Doe | 10 | Kim Gol | null | null
我想制作另一个列advrs
,其中包含所有advr名称(这将位于上方记录的末尾)
我可以用
listagg()
实现这一点,但速度非常慢。。。有没有我不知道的替代方法?类似这样的方法可能:
select user_id,
replace(
listagg(
advr1_name
|| decode(advr2_name, null, '', '# ' || advr2_name)
|| decode(advr3_name, null, '', '# ' || advr3_name)
, '; '
) within group (order by advr1_name),
'#', ';'
)
from your_tab
group by user_id;
如果您添加了
advr4…
或更多,则不美观或效率不高,也不完全可扩展,但这可能比Listag更快完成工作:
ltrim(rtrim(replace(advr1_name||'; '||advr2_name||'; '||advr3_name, '; ; ', '; '), '; '),'; ')
我可能会使用
advr1|u name | |'| |advr2\u名称
?但是我是否需要一个case语句来考虑空值,或者我是否可以以某种方式使用nvl()
?我尝试过这种方法,但它与listagg()一样慢,如果不慢的话。您可以使用它来代替nvl。但我认为你应该考虑你的数据集,添加一些范围过滤器,或索引,查询本身是缓慢的,ListaGG和案例结合合并将无济于事,在你的情况下。
ltrim(rtrim(replace(advr1_name||'; '||advr2_name||'; '||advr3_name, '; ; ', '; '), '; '),'; ')