将oracle 查询结果列拼接为字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将oracle 查询结果列拼接为字符串相关的知识,希望对你有一定的参考价值。

表中的原始数据为
id name
1 a
1 b
1 c
2 a
2 b
3 a
3 c
.......
现在想查询显示的结果为
id name
1 a,b,c
2 a,b
3 a,c
.......
sql语句咋写 在线等谢谢!急!!!!!

参考技术A create table test (id int, name varchar(10) )
insert into test values (1,'a')
insert into test values (1,'b')
insert into test values (1,'c')
insert into test values (2,'a')
insert into test values (2,'b')
insert into test values (3,'a')
insert into test values (3,'c')

select id,sys_connect_by_path(name,',') from (
select id,name, row_number() over(partition by id order by name)rn,
count(*) over(partition by id ) cnt from test
) a where level=cnt
start with rn=1 connect by prior id=id and prior rn=rn-1

测试后 可用。

一楼的回答其实最容易理解了。你把它修改成动态sql 就可以了。可以不受限制了。本回答被提问者采纳
参考技术B 个数有限,可以实现
select id, max(case when rk = 1 then name else '' end)
||','||max(case when rk = 2 then name else '' end)
||','||max(case when rk = 3 then name else '' end)
from (SELECT id, name,row_number() over(partition by id order by name) rk from tab) t
group by id追问

个数是不无限的,具体的值不确定,是根据关联关系出来的

追答

那自己写存储过程吧,sql不是万能的。

参考技术C select t.id, WMSYS.WM_CONCAT(t.Name) name From table_name t GROUP BY t.id追问

中文会出现乱码,咋解决

oracle把查询出的字段拼接在一起

比如列colA colB...
1 2

1 2
1 2
然后查出来的是这样
colA colB ...
1,1,1 2,2,2
其实最好是这样,就一个字段
colA

(1,2)(1,2)(1,2)

Oracle一列的多行数据拼成一行显示字符

oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。

先介绍:WMSYS.WM_CONCAT

例:

id name

1 aa

2 bb

3 cc

要的结果是"aa,bb,cc"

select WMSYS.WM_CONCAT(a.name) from user a

这样的话,查询出的结果:"aa,bb,cc"

分隔符如果不需要用英文的逗号,需要改成别的符号比如分号的,可以用下面的方法替换下:

select replace(WMSYS.WM_CONCAT(a.name),',',';') from user a

结果:"aa;bb;cc"

======================================================================

ListAgg函数

listagg函数的语法结构如下:

LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]

listagg虽然是聚合函数,但可以提供分析功能(比如可选的OVER()子句)。使用listagg中,下列中的元素是必须的: www.2cto.com

•需要聚合的列或者表达式

•WITH GROUP 关键词

•分组中的ORDER BY子句

例子:

DEPTNO ENAME

--------- ----------

10 CLARK

10 KING

10 MILLER

20 ADAMS

20 FORD

20 JONES

按照DEPTNO字段分组,对结果集进行字符串聚合,结果如下:

DEPTNO AGGREGATED_ENAMES

--------- -------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES

SQL:

SELECT deptno,LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp GROUP BY deptno;追问

那如果我要这种形式的数据呢》》???(1,2)(1,2)(1,2)

最后就一个字段,一行数据,,
写个方法也行
答对有加分,o(∩_∩)o

或者你告诉我怎么解决缓冲区太小的问题

参考技术A with temp as(
select 'China' nation ,'Guangzhou' city from dual union all
select 'China' nation ,'Shanghai' city from dual union all
select 'China' nation ,'Beijing' city from dual union all
select 'USA' nation ,'New York' city from dual union all
select 'USA' nation ,'Bostom' city from dual union all
select 'Japan' nation ,'Tokyo' city from dual
)
select nation,listagg(city,',') within GROUP (order by city)
from temp
group by nation

这是最基础的用法:
LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)

用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。

以上是关于将oracle 查询结果列拼接为字符串的主要内容,如果未能解决你的问题,请参考以下文章

oracle把查询出的字段拼接在一起

oracle同一列字符串拼接怎么做?

oracle 如何把一个变量中的字段拼接起来

sql select语句,查询出两列结果拼接在一起

将两条sql的查询结果拼接在一起显示

如何将Oracle中同一列的多行记录拼接成一个字符串