sql >> Databáze >  >> RDS >> Oracle

Funkce REGEXP_REPLACE() v Oracle

V Oracle, REGEXP_REPLACE() funkce nahradí výskyty podřetězce v řetězci, který odpovídá danému vzoru regulárního výrazu.

Rozšiřuje funkčnost REPLACE() tím, že nám umožňuje používat vzory regulárních výrazů.

Syntaxe

Syntaxe vypadá takto:

REGEXP_REPLACE ( source_char, pattern
                 [, replace_string
                    [, position
                       [, occurrence
                          [, match_param ]
                       ]
                    ]
                 ]
               )

Kde:

  • source_char je znakový výraz, který slouží jako hledaná hodnota.
  • pattern je regulární výraz.
  • replace_string je náhradní řetězec.
  • position je kladné celé číslo, které určuje, kde začít hledání. Výchozí hodnota je 1 , což znamená, že začněte hledat od prvního znaku.
  • occurrence je nezáporné celé číslo, které určuje, který výskyt se má nahradit. Výchozí hodnota je 0 , což znamená nahradit všechny výskyty.
  • match_param umožňuje změnit výchozí chování funkce při přiřazování. Umožňuje vám například určit rozlišování malých a velkých písmen, jak se pracuje s více řádky a mezerami atd. Tento argument funguje stejně jako při použití s ​​REGEXP_COUNT() funkce. Další informace naleznete v dokumentaci společnosti Oracle.

Příklad

Zde je základní příklad použití REGEXP_REPLACE() v Oracle:

SELECT 
    REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;

Výsledek:

Cats and birds

V tomto případě existuje shoda a podřetězec je nahrazen náhradním řetězcem.

Regulární výrazy mohou být velmi výkonné a tento příklad používá velmi jednoduchý příklad. Chcete-li použít REGEXP_REPLACE() efektivně, budete potřebovat znát správný vzor, ​​který použijete pro požadovaný výsledek.

Žádná shoda

Zde je příklad, kdy neexistuje žádná shoda:

SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

Výsledek:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
+------------------------------------------------+
| Cats and dogs                                  |
+------------------------------------------------+

Neexistuje žádná shoda, takže původní řetězec je vrácen beze změny.

Více shod

Zde je příklad s více shodami:

SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;

Výsledek:

My bird likes other birds

V případě potřeby však můžete určit, který výskyt se má nahradit:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;

Výsledek:

My dog likes other birds

Všimněte si, že jsem zde přidal dva argumenty – 1 a 2 . 1 určuje místo pobytu v řetězci pro zahájení vyhledávání (v tomto případě u prvního znaku). 2 je to, co určuje, který výskyt se má nahradit. V tomto případě je nahrazen druhý výskyt.

Co se stane, když zahájím vyhledávání po prvním výskytu:

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;

Výsledek:

My dog likes other dogs

V tomto případě se řetězec neaktualizuje, protože za počáteční pozicí je pouze jeden další výskyt.

Pokud změním poslední argument na 1 , pak se aktualizuje podle specifikace (protože je to první výskyt po zadané počáteční pozici):

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;

Výsledek:

My dog likes other birds

A pokud vás to zajímá, 0 určuje všechny výskyty:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 1, 0
    )
FROM DUAL;

Výsledek:

My bird likes big birds and small birds

Stále však respektuje jakoukoli zadanou výchozí pozici:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 7, 0
    )
FROM DUAL;

Výsledek:

My dog likes big birds and small birds

Rozlišovat malá a velká písmena

REGEXP_REPLACE() funkce se řídí pravidly Oracle pro určení a odvození řazení, která definují řazení, které se má použít při porovnávání řetězce se vzorem.

Pomocí volitelného šestého argumentu však můžete explicitně určit rozlišování malých a velkých písmen. Když to uděláte, přepíše to rozlišování malých a velkých písmen nebo zvýraznění v určeném řazení.

Můžete zadat i pro párování bez rozlišení velkých a malých písmen a c pro rozpoznávání velkých a malých písmen.

Zde je příklad:

SELECT 
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Výsledek:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
My Cats    My dogs             My Cats         

Z těchto výsledků se zdá, že moje výchozí řazení rozlišuje malá a velká písmena. Zbývající dva řetězce byly nuceny rozlišovat malá a velká písmena, respektive malá a velká písmena.

Nulové argumenty

Předávání null výsledkem je null pro většinu argumentů, kromě druhého a šestého argumentu:

SET NULL 'null';
SELECT 
    REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
    REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
    REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
FROM DUAL;

Výsledek:

      1      2       3       4       5      6 
_______ ______ _______ _______ _______ ______ 
null    Cat    null    null    null    Cat   

Ve výchozím nastavení vrátí SQLcl a SQL*Plus prázdné místo vždy, když null dochází v důsledku SQL SELECT prohlášení.

Můžete však použít SET NULL určit jiný řetězec, který má být vrácen. Zde jsem uvedl, že řetězec null by měl být vrácen.

Špatný počet argumentů

Pokud funkci předáte žádné nebo příliš málo argumentů, dojde k chybě:

SELECT REGEXP_REPLACE()
FROM DUAL;

Výsledek:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Totéž s předáváním příliš mnoha argumentů:

SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;

Výsledek:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

Další informace

REGEXP_REPLACE() funkce (stejně jako další implementace regulárních výrazů společnosti Oracle) odpovídá standardu IEEE Portable Operating System Interface (POSIX) pro regulární výrazy a směrnicím Unicode Regular Expression Guidelines Unicode Consortium.

Další informace a příklady REGEXP_REPLACE() naleznete v dokumentaci k Oracle funkce.


  1. Převeďte číslo měsíce na název měsíce v PostgreSQL

  2. Čtení clob řádek po řádku pomocí pl\sql

  3. 2 Funkce, které v MySQL vracejí název měsíce z data

  4. Aktualizace SQL pomocí row_number()