1. 程式人生 > >使用正則表示式對xml檔案中資料字典進行整理

使用正則表示式對xml檔案中資料字典進行整理

在工作中,需要對xml檔案中資料字典進行整理。
SQL> create table t1(text varchar2(4000));
 
表已建立。
 
SQL> insert into t1 values('        <enumeration id="QX" value="0" longname="許可權資訊" />
  2          <enumeration id="GYJS" value="1" longname="櫃員角色關聯資訊" />
  3  <enumeration id="JSQX" value="2" longname="角色許可權關聯資訊" />');
 1 row inserted 

SQL> commit;
 
Commit complete
 
SQL> select * from t1;
 
TEXT
----------------------------------------------------------------------------------------------------
        <enumeration id="QX" value="0" longname="許可權資訊" />
        <enumeration id="GYJS" value="1" longname="櫃員角色關聯資訊" />
        <enumeration id="JSQX" value="2" longname="角色許可權關聯資訊" />
這裡是一行資料,現在需要顯示出如下格式:
 
TEXT
----------------------------------------------------------------------------------------------------
0-許可權資訊1-櫃員角色關聯資訊2-角色許可權關聯資訊
即將裡面的value和longname提取出來,使用“-”連線。

SQL語句為:
首先將v開頭的部分截取出來,將包含value|longname|=|"|/>替換,使用trim函式處理前後空格,最後使用listagg函式進行列轉行,
注:order by 1也可以,同時regexp_replace函式將不是數字的部分替換為空。
 
SQL> select listagg(string3) within group(order by regexp_replace(string3, '[^0-9]', ''))
  2    from (select replace(string2, ' ', '-') string3
  3            from (select trim(regexp_replace(string1,
  4                                             '(value|longname|=|"|/>)',
  5                                             '')) string2
  6                    from (select text,
  7                                 regexp_substr(text, 'v.*', 1, level) string1
  8                            from t1
  9                          connect by level <= regexp_count(text, 'value'))))
 10  ;
LISTAGG(STRING3)WITHINGROUP(OR
--------------------------------------------------------------------------------
0-許可權資訊1-櫃員角色關聯資訊2-角色許可權關聯資訊