Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将字段合并为一列_Sql_Oracle - Fatal编程技术网

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, '; ; ', '; '), '; '),'; ')