Оставьте только текст между Меньше чем и Больше чем - PullRequest
1 голос
/ 26 марта 2020
with src as (
   select 'hello <blah1> boy and <blah2>' as int from dual
)
select regexp_replace(int, '\<(.+?)\>')
from src;

Здравствуйте, как я могу оставить только blah1 и blah2 - противоположность тому, что запрос возвращает прямо сейчас. Спасибо.

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Вы можете использовать ниже, когда есть более 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); 
0 голосов
/ 29 марта 2020

Это запрос, который я искал:

REGEXP_REPLACE (INT, '. *? (\ <(. +?)> | $)', '\ 1,')

Результат:

<ATA WDC WD40EFRX-68N 0A82>, <ATA WDC WD40EFRX-68N 0A82>, <ATA WDC WD40EFRX-68N 0A82>, <ATA WDC WD40EFRX-68N 0A82>, <DOGFISH SSD 64GB V8301c64>, <DOGFISH SSD 64GB V8301c64>, , ,

Мне нужно только удалить <,> и я в порядке. Благодаря.

0 голосов
/ 26 марта 2020

Вы можете использовать REGEXP_SUBSTR следующим образом:

SQL> with src as (
  2     select 'hello <blah1> boy and <blah2>' as int from dual
  3  )
  4  SELECT
  5      REGEXP_SUBSTR(INT, '\<(.+?)\>', 1, 1)
  6      || ' '
  7      || REGEXP_SUBSTR(INT, '\<(.+?)\>', 1, 2) AS RESULT
  8  FROM
  9      SRC;

RESULT
---------------
<blah1> <blah2>

SQL>

Второй последний параметр в REGEXP_SUBSTR указывает начальную позицию для начала поиска, а последний параметр в REGEXP_SUBSTR указывает на возникновение.

...