您的位置:首页 > 数据库 > Oracle

Oracle 关于oracle自带的行转列函数

2016-03-11 14:55 525 查看
前言:

环境是java+hibernate+oracle11g

目标是将某表中根据id分组后将name字段的值拼接到一列中,且用“,“进行分割

 

试过用 wm_concat() 结合 group by , 在pl/sql中执行正常,

但是在java程序运行时会报: ORA-22922:不存在的 LOB 值

 

1.没用hql查询,用的纯sql

2.也将字段转换为varchar类型了: cast(wm_concat(name) as varchar2(2000))

 

很头疼,网上说可能是hibernate的原因,

后来找了可以替代wm_concat()的方法 listagg(name, ',')

语法如下:

listagg(name, ',')  within  group(order by id)

 

应该很好理解:listagg方法的第一个参数是需要进行拼接的字段,第二个参数是字段分隔符,

within 和 order by 是必须的, order by决定了拼接后的各name值的展示顺序

注意,不要忘了group by 

例如 表 tmp

id  name

1   a

2   b

3   c

2   d

2   c

3   x

sql语句这样写:

 

select id,listagg(name, ',')  within  group(order by name) from tmp

group by id

 
 

结果为:

1   a

2   b,c,d

3   c,x

 

如果将order by name 改为 order by name desc

结果应该为:

1   a

2   d,c,b

3   x,c

当然,也可以order  by 其他字段。根据需要来。

以上例子已经过人工测试,保证可用。

ok,收工回家。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: