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

Funkce REGEXP_SUBSTR() v Oracle

V Oracle, REGEXP_SUBSTR() Funkce vrací podřetězec z řetězce na základě vzoru regulárního výrazu.

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

Syntaxe

Syntaxe vypadá takto:

REGEXP_SUBSTR ( source_char, pattern
                [, position
                   [, occurrence
                      [, match_param
                         [, subexpr ]
                      ]
                   ]
                ]
              )

Kde:

  • source_char je znakový výraz, který slouží jako hledaná hodnota.
  • pattern je regulární výraz.
  • 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á hledat. Výchozí hodnota je 1 , což znamená, že vyhledá první výskyt.
  • 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 Oracle pro tuto funkci.
  • Pro pattern s podvýrazy, subexpr je nezáporné celé číslo od 0 do 9 udávající, který podvýraz v pattern má být vráceno funkcí. Tento argument funguje stejně jako při použití s ​​REGEXP_INSTR() funkce. Další informace o této funkci naleznete v dokumentaci společnosti Oracle.

Příklad

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

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

Výsledek:

dog

V tomto případě existuje shoda a je vrácen první (a v tomto případě jediný) odpovídající podřetězec.

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_SUBSTR() 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:

SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;

Výsledek:

null

Neexistuje žádná shoda, takže null je vráceno.

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.

Více shod

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

SELECT 
    REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;

Výsledek:

dog

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

SELECT 
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Výsledek:

dag

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á hledat. V tomto případě se hledá druhý výskyt.

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

SELECT 
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Výsledek:

null

V tomto případě se nejedná o žádnou shodu, protože po startovní pozici je pouze jeden další výskyt.

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

SELECT 
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Výsledek:

dag

Rozlišovat malá a velká písmena

REGEXP_SUBSTR() 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 páté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_SUBSTR('My Cats', 'c.t', 1, 1) AS "Default",
    REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'i') AS "Case Insensitive",
    REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'c') AS "Case Sensitive"
FROM DUAL;

Výsledek:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
null       Cat                 null             

Na základě těchto výsledků se zdá, že moje ř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.

Podvýrazy

Zde je příklad použití šestého argumentu k vrácení konkrétního vzoru podvýrazu:

SELECT REGEXP_SUBSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 'i', 1
    )
FROM DUAL;

Výsledek:

cat

V tomto případě jsem vrátil první podvýraz.

Zde je to, co se stane, když zadám třetí podvýraz:

SELECT REGEXP_SUBSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 'i', 3
    )
FROM DUAL;

Výsledek:

cow

Nulové argumenty

Pokud je některý argument null , výsledkem je null :

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

Výsledek:

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

Špatný počet argumentů

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

SELECT REGEXP_SUBSTR()
FROM DUAL;

Výsledek:

Error starting at line : 1 in command -
SELECT REGEXP_SUBSTR()
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éž platí, když předáme příliš mnoho argumentů:

SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL;

Výsledek:

Error starting at line : 1 in command -
SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, '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_SUBSTR() 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_SUBSTR() naleznete v dokumentaci k Oracle funkce.


  1. Oracle - Jak vytvořit uživatele pouze pro čtení

  2. ORA-01438:hodnota větší než specifikovaná přesnost povolená pro tento sloupec při vkládání 3

  3. Jak uložit BLOB jako soubor v PL/SQL?

  4. Časová část pole DateTime v SQL