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

原文地址:https://www.cnblogs.com/mzq123/p/10080679.html

时间: 2024-10-08 19:39:51

Oracle列转行函数版本不兼容解决方案的相关文章

Oracle 列转行函数 Listagg()

这是一个Oracle的列转行函数:LISTAGG() 先看示例代码: Sql代码   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' nat

oracle 列转行函数listagg、判断函数decode

1.decode 使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 某些场景可以代替case when 2.listagg 首先看下数据情况 想把这个人的阶段列转成一行分隔显示使用listagg函数 select listagg (decode(sts,'A',coll_stage),',') within group (

转:Oracle的列转行函数:LISTAGG()

先看示例代码: Sql代码   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 d

Oracle字符串转行函数

前言 有时候比如一个字符串 : namestr  内容:‘张三,李四,王五,刘八,肖六’  . 一张表:pati_info_basic  字段:姓名,年龄等.. 我们要从该表中查出上述字符串包含的所有人的信息. 此时用: select * from pati_info_basic where patiname where patiname in namestr 肯定是不行的.而且有时候姓名之间不是用逗号相隔,而是用其他符号相隔的呢? 解决方案 一个实现思路是 :先把namestr字符串转成 张三

架构版本与 NuGet 的版本不兼容 解决方案

VS的NuGet管理在大大提高了开发效率,一直都在使用但今天在遇到了一个问题,引用一个所需要的NuGet包VS缺提示如下错误 此时是否有点无奈呢, 因为本人所使用的是VS2012版本确实较旧 但项目维护 VS升级 想了一下 放弃了原因你懂得... 此时解决方法非常之简单 点击此ID 你就可以在浏览器看到微软官网 所罗列的所有历史版本选择你所需要的历史版本 官网已经非常友好的给出了 PM命令 你只需 黏贴复制 然后回车 符合你项目所需的 NuGet 包就安装好了

oracle列转行 WM_CONCAT LISTAGG

开发给个SQL说给某个条件时报ORA-22922 代码段: 1 SELECT 袋号, 2 SUM(实际重量) AS 实际重量, 3 SUM(材积重量) AS 材积重量, 4 COUNT(运单号) AS 件数, 5 TO_CHAR(WMSYS.WM_CONCAT(运单号)) AS 运单编号 6 FROM TBL 7 GROUP BY 袋号 修改成如下后解决: 1 SELECT 袋号, 2 SUM(实际重量) AS 实际重量, 3 SUM(材积重量) AS 材积重量, 4 COUNT(运单号) AS

oracle 列转行

with temp as( select 'A01' nation ,1 as S1,2 as S2, 3 as S3 from dual union all select 'A02' nation ,null as S1,5 as S2, 6 as S3 from dual ) select * from temp unpivot(Qty for Sizes in(s1,s2,s3))

oracle 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

Oracle的nvl函数和nvl2函数

一.基本语法 介绍一下oracle的nvl函数和nvl2函数. nvl函数 nvl函数基本语法为nvl(E1,E2),意思是E1为null就返回E2,不为null就返回E1. nvl2函数 nvl2函数的是nvl函数的拓展,基本语法为nvl2(E1,E2,E3),意思是E1为null,就返回E3,不为null就返回E2. 二.业务场景 nvl()函数比较常用的是这样的nvl(E1,0),意思是E1参数查询到为null的情况,就返回0,不为null就返回E1,常用于非空校验. nvl2()函数也讲