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

Jak wyciąć fragment tekstu z varchar2 przy użyciu REGEXP_REPLACE
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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ć:

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

Napisałem coś takiego:

Kopiuj
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?

S8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 63
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?

AT
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

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

Kopiuj
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);
DB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
1

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

Kopiuj
'SSL([,' '])*|([,' '])*SSL'
Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.