Oracle OCP笔记(34)Oracle的特殊功能函数

Oracle OCP笔记(34)Oracle的特殊功能函数



    Oracle有一些特殊功能函数,不太常用,但有时候很有用.


一.列转行
1.多笔数据分组横向显示(使用wmsys.wm_concat)
    with test as(
      select 1 a, 'XXX' b from dual
      union
      select 1 a, 'YYY' b from dual
      union
      select 2 a, 'ZZZ' b from dual
    )
    select a, to_char(wmsys.wm_concat(b)) list_value
      from test
     group by a;


    显示结果如下:
    LIST_VALUE
    --------------------------------------------------------------------------------
    1XXX1YYY
    2ZZZ


    wmsys.wm_concat的返回值是CLOB.
    wmsys.wm_concat是一个内部使用的函数,Oracle随时可以取消此函数,Oracle 12已不包含此函数.


2.多笔数据分组横向显示(使用listagg)
    with test as(
      select 1 a, 'XXX' b from dual
      union
      select 1 a, 'YYY' b from dual
      union
      select 2 a, 'ZZZ' b from dual
    )
    select listagg(a||b) within group(order by a) list_value
      from test
     group by a;


    显示结果如下:
    LIST_VALUE
    --------------------------------------------------------------------------------
    1XXX1YYY
    2ZZZ


    listagg的返回值是VARCHAR2,有长度限制,最长32767.


二.行转列
1.行转列(使用sys.odcivarchar2list)
    select column_value
      from table(sys.odcivarchar2list('1','2','3','4','5'));


    显示结果如下:
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    1
    2
    3
    4
    5


2.行转列(使用CONNECT和正则表达式)
    select regexp_substr('1,2,3,4,5','[^,]+',1,rownum) list_value
      from dual
     connect by rownum <= length('1,2,3,4,5') - length(replace('1,2,3,4,5',',')) +1;


    显示结果如下:
    LIST_VALUE
    ------------------
    1
    2
    3
    4
    5


三.正则表达式替换
    select regexp_replace('123456789', '678', 'WXYZ', 1 , 0, lower('I')) replace_value from dual;


    显示结果如下:
    REPLACE_VALUE
    -------------
    12345WXYZ9


    替换搜索字符串有单边括号等特殊字符会报错,需要用斜杠转义.
    select regexp_replace('123456789', '678(', '890', 1 , 0, lower('I')) from dual;    --报错
    select regexp_replace('12345678(9', '678\(', '890(', 1 , 0, lower('I')) from dual; --用斜杠转义后没有错误
    需要转义的符号\/|().?*+[]{}^$等等.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值