您的位置:首页 > 数据库 > Oracle

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

2016-12-03 13:57 375 查看

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; --用斜杠转义后没有错误

    需要转义的符号\/|().?*+[]{}^$等等.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle ocp