• 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,收工回家。

     

     

     

  • 相关阅读:
    戴尔英语09年互联网络投放策略规划书
    haproxy相关
    邮送广告
    python和rails交互应用
    ubuntu搭建邮件服务器
    waitr自动化测试
    ruby写爬虫
    free git svn repositories
    网站开发外包遇到的问题
    电影推荐
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541144.html
Copyright © 2020-2023  润新知