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语句这样写:
结果为:
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,收工回家。
环境是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,收工回家。
相关文章推荐
- Oracle 序列插入使用
- Oracle的锁表与解锁
- Oracle 动态sql小例子
- [转]ORACLE EXECUTE IMMEDIATE 小结
- Oracle 循环调用存储过程
- Oracle 当输入参数允许为空时
- Oracle 生成数据字典
- [转]Oracle 存储过程语法
- Oracle-基本SQL语句
- oracle更新统计信息以及解锁统计信息
- Oracle实例与Oracle数据库
- Oracle客户端库时引发BadImageFomatException
- How to use udev for Oracle ASM in Oracle Linux 6 怎样使用udev在linux 6系统上使用asm
- ORACLE用GROUP BY 来分组日期字段 按月分组
- oracle表查询速度极慢的处理过程记录一下
- ORACLE创建序列
- oracle11g R2 grid和database卸载
- oracle恢复删除后的数据
- 【转】oracle表分区详解
- ORA-26663 Oracle Streams 在删除进程出错