Oracle列转行函数版本不兼容解决方案
业务场景
本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法去解决。但是这种办法并不一定适用所有的业务场景。我并没有采用。不过有些场景还是可以使用的。
网上优秀例子
下面是网络记录比较详细的例子
https://www.cnblogs.com/hanzongze/p/oracle-wm_concat.html
解决方案
通过自定义函数解决也是可以的,不过我并不是这样做的。
下面介绍一下我的解决方法。首先分析一下,Oracle11不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数
语法:listagg(参数,'分隔符') within group(order by 参数id)
列子:to_char(listagg(ur.user_role,',' ) within GROUP (order by (ur.user_role))) userrole,
原来SQL:
select u.user_sex,
u.full_name,
u.user_code,
to_char(wm_concat(ur.user_role)) userrole,
to_char(wm_concat(r.role_name)) rolename,
to_char(r.role_type) roletype,
u.status
from t_user u
left outer join t_user_role ur
on ur.user_code = u.user_code
left outer join t_role r
on r.user_role = ur.user_role
首先通过SQL获取一下oracle版本号
<!-- 获取oracle版本信息 -->
<select id="getOracleVersion" resultType="string">
SELECT * FROM v$version WHERE banner LIKE 'Oracle%'
</select>
下面代码仅供参考,就是获取oracle版本号,然后传到mybatis的xml文件
String oracleVersion = approveConfigDao.getOracleVersion();
//eg:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
String[] bannerArr = oracleVersion.split(" ");
oracleVersion = bannerArr[2];
LOG.info("oracle版本:"+oracleVersion);
map.put("oracleVersion", oracleVersion);
orm框架是用mybatis的,所以sql稍微改一下,oracle10调vm_concat,oralce11的调listagg函数
select u.user_sex,
u.full_name,
u.user_code,
<choose>
<when test="oracleVersion=='11g' or oracleVersion=='12g'">
to_char(listagg(ur.user_role,',' ) within GROUP (order by (ur.user_role))) userrole,
to_char(listagg(r.role_name,',' ) within GROUP (order by (r.role_name))) rolename,
</when>
<otherwise>
to_char(wm_concat(ur.user_role)) userrole ,
to_char(wm_concat(r.role_name)) rolename ,
</otherwise>
</choose>
to_char(r.role_type) roletype,
u.status
from t_user u
left outer join t_user_role ur
on ur.user_code = u.user_code
left outer join t_role r
on r.user_role = ur.user_role
Oracle列转行函数版本不兼容解决方案的更多相关文章
- Oracle列转行函数LISTAGG()
--Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...
- Oracle列转行函数Listagg以及pivot查询示例
简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...
- Oracle列转行函数使用
一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...
- Oracle 列转行函数 Listagg()
这是最基础的用法: LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX) 例: select listagg(oeid,',') within GROUP (ord ...
- Oracle列转行 参数动态传入iBatis使用示例
Oracle行转列 参数动态传入iBatis使用示例 最近做了一个需求,需要获取工作流数据的各个节点的渠道数量信息,各渠道的费用信息~ 之前的需求是只需要获取渠道数据,所以做了渠道兼容,每个渠道数量的 ...
- oracle中行转列、列转行函数
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str ...
- oracle列转行
unpivot()函数需要Oracle版本大于等于11g --创建表 create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 in ...
- oracle 的列转行函数 listagg()
当你的表X中有A,B两列,数据如下 A B a 1 a 2 a 3 b 1 b 2 b 3 想让数据以 a|1|2|3 , b|1|2|3 格式显示可使用listagg() 1.使用listagg() ...
- 转:Oracle的列转行函数:LISTAGG()
先看示例代码: with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nat ...
随机推荐
- 分析easyswoole3.0源码,服务启动为例(二)
以下内容需要结合es的源码,不然可能会觉得跳跃.先描述下es启动的大致流程.es启动的时候注册异常处理函数以及加载配置文件.根据位置文件的设置选择启动哪种swoole服务.然后用一个事件注册类,注册s ...
- web自动化上传附件 2
当我们进行某一项web自动化脚本编写时,有上传附件操作,点击附件直接打开了windows窗口,而有的点击添加附件打开一个小窗体,再点击‘浏览’才打开windows窗口, 中间多了这么一个小窗体的操作, ...
- python中的继承和多态
继承 继承的表现方式: class Animal(): pass class Cat(Animal): #animal是cat的父类,也可以说是基类 pass print(Cat.__bases__) ...
- 【转】为什么分布式一定要有Redis?
发现一篇好文. https://studygolang.com/articles/15064
- EasyPR源码剖析(3):车牌定位之颜色定位
一.简介 对车牌颜色进行识别,可能大部分人首先想到的是RGB模型, 但是此处RGB模型有一定的局限性,譬如蓝色,其值是255,还需要另外两个分量都为0,不然很有可能你得到的值是白色.黄色更麻烦,它是由 ...
- 七、PyQT5控件——QSlider,QSpinBox
一.Qslider QSlider是一个滑动条,可以设置成水平或垂直放置.最常用的方法允许用户在某一范围内互动该滑块,并将滑块的位置转换成一个整数值(int类型),这种方式可以在某一个范围内平顺的变动 ...
- 分享一个14年写的用户管理类-swift版
AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...
- Vmware Workstation实现CentOS6.10_x64 下ORACLE RAC 11.2.0.4的搭建
想必大家在学习ORACLE 11g时,都想搭建一个RAC的实验环境.在搭建RAC实验环境时,会碰到诸如IP怎么规划.虚拟机环境下怎么共享磁盘.ASM磁盘创建,以及安装过程中会遇到这样那样的问题.搭建一 ...
- day33 锁和队列
队列 #put 和 get #__author : 'liuyang' #date : 2019/4/16 0016 上午 11:32 # 多进程之间的数据是隔离的 # 进程之间的数据交互 # 是可 ...
- 初入TensorFlow————配置TensorFlow
能看到这说明你对python已经有一定的了解了,因此很多基础直接跳过. 一.TensorFlow环境配置: TensorFlow的环境配置在网上很多的教程都是用anaconda的方式,但是很容易出现冲 ...