我有一個table
從我只需要得到記錄的一部分with comma
後的一部分記錄。甲骨文由正則表達式分裂,並再次彙總
for example
我
ABCD [1000-1987] BCD[101928-876] adgs[10987-786]
我想要得到的record
,如:
1000-1987,101928-876,10987-786
能否請你幫我提到獲得備案。
我有一個table
從我只需要得到記錄的一部分with comma
後的一部分記錄。甲骨文由正則表達式分裂,並再次彙總
for example
我
ABCD [1000-1987] BCD[101928-876] adgs[10987-786]
我想要得到的record
,如:
1000-1987,101928-876,10987-786
能否請你幫我提到獲得備案。
如果不使用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_substr
:regexp_substr - Oracle Documentation - 10g
瞭解更多關於regexp_substr
:regexp_substr - Oracle Documentation - 11g
你不必拆分,然後聚集它。您可以使用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;
你試過了什麼?你在這個論壇搜索regexp,substr? – SriniV