Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak uciec od regexp_replace w Oracle?

To powinno działać, pod warunkiem, że nie masz danych wejściowych, które wyglądają jak %ABC#%ABC#

SELECT REGEXP_REPLACE( '%ABC#abc\%ABC#', '((^|[^\])(\\\\)*)%ABC#', '\1XXX' )
FROM DUAL;

To będzie pasować:

  • Początek ciągu ^ lub znak inny niż ukośnik [^\] po którym następuje dowolna liczba par znaków ukośnika, a na końcu znaki %ABC# . To będzie pasować do %ABC# , \\%ABC# , \\\\%ABC# i tak dalej, ale nie pasuje do \%ABC# , \\\%ABC# , \\\\\%ABC# gdzie jest ukośnik poprzedzający % postać.

Zastąpienie obejmuje pierwszą grupę przechwytywania, ponieważ wyrażenie może pasować do poprzedzającego znaku bez ukośnika i par ukośników, które muszą być zachowane w danych wyjściowych.

Aktualizacja

To trochę się komplikuje, ale spowoduje powtarzające się dopasowania:

WITH Data ( VALUE ) AS (
  SELECT '%ABC#%ABC#' FROM DUAL
)
SELECT ( SELECT LISTAGG(
                  REGEXP_REPLACE( COLUMN_VALUE, '((^|[^\])(\\\\)*)%ABC#$', '\1XXX' ),
                  NULL
                ) WITHIN GROUP ( ORDER BY NULL )
         FROM   TABLE(
                  CAST(
                    MULTISET(
                      SELECT  REGEXP_SUBSTR( d.value, '.*?(%ABC#|$)', 1, LEVEL )
                      FROM    DUAL
                      CONNECT BY LEVEL < REGEXP_COUNT( d.value, '.*?(%ABC#|$)' )
                    AS SYS.ODCIVARCHAR2LIST
                  )
                )
       ) AS Value
FROM   Data d;

Używa skorelowanego podzapytania, aby podzielić ciąg na podciągi, które kończą się %ABC# lub koniec ciągu (jest to bit wewnątrz TABLE( CAST( MULTISET( ) .. ) ) ), a następnie ponownie łączy te podciągi po wykonaniu zamiany na końcu każdego podciągu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP OCI, Oracle i domyślny format liczb

  2. Oracle ORA-01805 na bazie danych Oracle 11g

  3. ORA - 00933 zamieszanie ze sprzężeniem wewnętrznym i as

  4. ORA-03113:koniec pliku na kanale komunikacyjnym

  5. SQL:Po połączeniu tabel funkcja SUM() zwraca błędną wartość