Вы можете использовать ниже, когда есть более 2 тегов, как бла
WITH src
AS (SELECT '<ATA WDC WD40EFRX-68N 0A82> at scbus0 target 6 lun 0 (pass0,da0), <ATA WDC WD40EFRX-68N 0A82> at scbus0 target 7 lun 0 (pass1,da1), <ATA WDC WD40EFRX-68N 0A82> at scbus0 target 8 lun 0 (pass2,da2), <ATA WDC WD40EFRX-68N 0A82> at scbus0 target 9 lun 0 (pass3,da3), <DOGFISH SSD 64GB V8301c64> at scbus1 target 0 lun 0 (pass4,ada0), <DOGFISH SSD 64GB V8301c64> at scbus2 target 0 lun 0 (pass5,ada1),
' AS INT
FROM dual),
lvltab
AS (SELECT LEVEL lvl
FROM dual,
src
CONNECT BY LEVEL <= Regexp_count(INT, '\<(.+?)\>'))
SELECT TRANSLATE(Listagg(Regexp_substr (INT, '\<(.+?)\>', 1, lvl), ', ')
within GROUP ( ORDER BY INT), 'a<>', 'a')
FROM src,
lvltab
Если есть несколько строк, вы можете использовать ниже
WITH src
AS (SELECT 'hello <blah1> boy and <blah2>' AS INT
FROM dual
UNION ALL
SELECT 'hello <blah1> boy and <blah2>' AS INT
FROM dual
UNION ALL
SELECT 'hello <blah1> boy and <blah2> <black> <sheep>' AS INT
FROM dual),
src1
AS (SELECT INT
||ROWNUM AS INT
FROM src),
lvltab
AS (SELECT DISTINCT LEVEL lvl
FROM dual,
src1
CONNECT BY LEVEL <= Regexp_count(INT, '\<(.+?)\>')
ORDER BY lvl DESC)
SELECT req
FROM (SELECT DISTINCT Listagg(Regexp_substr (a.INT, '\<(.+?)\>', 1, lvl), ' ')
within GROUP ( ORDER BY a.INT, lvl) over (
PARTITION BY a.INT) req,
a.INT
FROM lvltab b,
src1 a
ORDER BY a.INT);