Jak wyciąć fragment tekstu z varchar2 przy użyciu REGEXP_REPLACE

0

Witajcie mam pytanie. Potrzebuję wyrażenie regularne które z podanego varchara:

select 'SSL, LOGO, CB, CLESS, DCC, DCCTS, LOGO, DINER, EVOU, ISK, IWK, LOGO, DDD, SSL, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL, SSL' from dual

wytnie mi zadane parametry po przecinku przykład: 'LOGO,SSL'. Zapytanie ma zwócić:

select 'CB, CLESS, DCC, DCCTS, DINER, EVOU, ISK, IWK, DDD, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL' from dual

Napisałem coś takiego:

select REGEXP_REPLACE(REPLACE('SSL, LOGO, CB, CLESS, DCC, DCCTS, LOGO, DINER, EVOU, ISK, IWK, LOGO, DDD, SSL, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL, SSL',' ',''),'LOGO(\,)?|(\,)?SSL','') from dual

ale niestety w zależności od parametru zostawia mi przecinek z przodu lub nie zostawia spacji / przecinka między np DCCTS i DINER. Możecie pomóc?

0

Może lepiej będzie zrobić splita po przecinku, następnie trim, a później zrobić joina z parametrami?
Czy te parametry mają pochodzić z jakiejś innej tabeli czy po prostu są to parametry zapytania?

0

Ten "potworek" to jest tylko pewne obejście Twojego problemu więc traktuj to jako "ciekawostkę" ;)

SELECT listagg(cor.varchar_as_row, ', ') within GROUP(ORDER BY cor.lp) AS new_varchar
  FROM (SELECT regexp_substr(REPLACE('SSL, LOGO, CB, CLESS, DCC, DCCTS, LOGO, DINER, EVOU, ISK, IWK, LOGO, DDD, SSL, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL, SSL', ' ', ''), '[^,]+', 1, LEVEL) AS varchar_as_row,
               row_number() over(ORDER BY LEVEL) AS lp
          FROM dual
        CONNECT BY regexp_substr('SSL, LOGO, CB, CLESS, DCC, DCCTS, LOGO, DINER, EVOU, ISK, IWK, LOGO, DDD, SSL, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL, SSL',  '[^,]+', 1, LEVEL) IS NOT NULL) cor
 WHERE varchar_as_row NOT IN
       (SELECT regexp_substr('LOGO,SSL', '[^,]+', 1, LEVEL)
          FROM dual
        CONNECT BY regexp_substr('LOGO,SSL', '[^,]+', 1, LEVEL) IS NOT NULL);
1

Może jak poniżej
powielasz dla każdego parametru, który chcesz usunąć

'SSL([,' '])*|([,' '])*SSL'
SELECT REGEXP_REPLACE(REPLACE('SSL, LOGO, CB, CLESS, DCC, DCCTS, LOGO, DINER, EVOU, ISK, IWK, LOGO, DDD, SSL, PRTAN, PUAL, PUMB, RFAL, RFMB, RVAL, SSL',' ',''),'SSL([,' '])*|([,' '])*SSL|LOGO([,' '])*|([,' '])*LOGO','') FROM dual

1 użytkowników online, w tym zalogowanych: 0, gości: 1