2013-10-23 34 views
0

我有一個table從我只需要得到記錄的一部分with comma後的一部分記錄。甲骨文由正則表達式分裂,並再次彙總

for example

ABCD [1000-1987] BCD[101928-876] adgs[10987-786]

我想要得到的record,如:

1000-1987,101928-876,10987-786

能否請你幫我提到獲得備案。

+1

你試過了什麼?你在這個論壇搜索regexp,substr? – SriniV

回答

4

如果不使用11g和不想使用wm_concat

WITH 
    my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual 
) 
SELECT 
    ltrim(
     MAX(
     sys_connect_by_path(
      rtrim(ltrim(regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL), '['), ']'), 
      ',') 
    ), 
    ',') AS val_part 
    FROM my_data 
CONNECT BY regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL) IS NOT NULL 
; 

如果使用wm_concat對你來說是OK:

WITH 
    my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual 
) 
SELECT 
    wm_concat(rtrim(ltrim(regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL), '['), ']')) AS val_part 
    FROM my_data 
CONNECT BY regexp_substr(val, '\[[0-9-]*\]', 1, level, NULL) IS NOT NULL 
; 

如果使用11克:

WITH 
    my_data AS (
    SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val FROM dual 
) 
SELECT 
    listagg(regexp_substr(val, '[a-b ]*\[([0-9-]*)\] ?', 1, level, 'i', 1), ',') WITHIN GROUP (ORDER BY 1) AS val_part 
    FROM my_data 
CONNECT BY regexp_substr(val, '[a-b ]*\[([0-9-]*)\] ?', 1, level, 'i', 1) IS NOT NULL 
; 

瞭解更多abou牛逼字符串聚合技術:Tim Hall about aggregation techniques

瞭解更多關於regexp_substrregexp_substr - Oracle Documentation - 10g

瞭解更多關於regexp_substrregexp_substr - Oracle Documentation - 11g

2

你不必拆分,然後聚集它。您可以使用regexp_replace僅將這些字符保留在方括號內,然後用逗號替換方括號。

WITH my_data 
    AS (SELECT 'ABCD [1000-1987] BCD[101928-876] adgs[10987-786]' AS val 
      FROM DUAL) 
SELECT RTRIM (
      REPLACE (
       REGEXP_REPLACE (val, '(\[)(.*?\])|(.)', '\2'), 
        ']', ','), 
      ',') 
    FROM my_data;