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 ...
随机推荐
- jieba库词频统计
一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组:除此之外,jieba 库还提供了增加自定义中文 ...
- 图解HTTP第七章
确保 Web 安全的HTTPS 1>HTTP 的缺点 通信使用明文可能会被窃听: [1]TCP/IP 是可能被窃听的网络 [2]加密处理防止被窃听: *通信的加密:通过和 SSL(Secure ...
- 微信小程序开发之搞懂flex布局3——Flex Item
Flex Item flex容器的子元素就是这个容器的flex item. The direct children of a Flex Container (elements with display ...
- Codeforces Round #538 (Div. 2) CTrailing Loves (or L'oeufs?)
这题明白的意思就是求n!在b进制下的后缀零的个数. 即最大的n!%(b^k)==0的k的值.我们需要将如果要构成b这个数,肯定是由一个个质因子相乘得到的.我们只需要求出b的质因子,然后分析n!中可以组 ...
- 计算机爱好者协会技术贴markdown第二期
上一期我们学了多级标题,加粗,加斜以及蛮好看的小方块,这一期来继续学习吧 Txt版本: *上一期说这样可以加斜* _其实这样也可以加斜_ **上一期说这样可以加粗** __其实这样也可以加粗__ ** ...
- 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)
传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...
- JMeter接口压测——ServerAgent监控服务端性能指标
ServerAgent作为一个服务端性能监控插件,结合JMeter自身插件PerfMon可以实现JMeter压测的图形化实时监控,具有良好的实用性.下面讲解一个应用实例 思路: 1. 插件准备 2.打 ...
- 爬虫学习笔记-urllib库
urllib库是python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数:在python3的urllib库中,所有和网络 ...
- shell脚本学习-分支结构
跟着RUNOOB网站的教程学习的笔记 if语法格式 if condition then command1 command2 ... commandN fi 写成一行(使用于终端命令提示符): ]; t ...
- JavaScript基础视频教程总结(121-130章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...