zoukankan      html  css  js  c++  java
  • Oracle 关于oracle自带的行转列函数

    前言:

    环境是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,收工回家。

     

     

     

  • 相关阅读:
    leetcode 70 Climbing Stairs
    leetcode 203 Remove Linked List Elements
    【HMM】
    【设计总结】
    【docker】导出导入容器
    【设计工具】样机图
    【设计细节】apple sound
    【产品分析】盒马生鲜 套路
    【喂到嘴经济】这个词有点意思
    【需求分类】KANO模型
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541144.html
Copyright © 2011-2022 走看看