sql >> Database teknologi >  >> RDS >> Oracle

REGEXP_SUBSTR() Funktion i Oracle

I Oracle er REGEXP_SUBSTR() funktion returnerer en understreng fra en streng baseret på et regulært udtryksmønster.

Det udvider funktionaliteten af ​​SUBSTR() funktion ved at tillade os at bruge regulære udtryksmønstre.

Syntaks

Syntaksen ser sådan ud:

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

Hvor:

  • source_char er et tegnudtryk, der tjener som søgeværdi.
  • pattern er det regulære udtryk.
  • position er et positivt heltal, der angiver, hvor søgningen skal begynde. Standarden er 1 , hvilket betyder, start søgningen ved det første tegn.
  • occurrence er et ikke-negativt heltal, der angiver, hvilken forekomst der skal søges efter. Standarden er 1 , hvilket betyder søgninger efter den første forekomst.
  • match_param lader dig ændre funktionens standardmatch-adfærd. For eksempel giver det dig mulighed for at angive forskel på store og små bogstaver, hvordan flere linjer og mellemrum behandles osv. Dette argument fungerer på samme måde, som når det bruges med REGEXP_COUNT() fungere. Se Oracles dokumentation for den funktion for at få flere oplysninger.
  • For et pattern med underudtryk, subexpr er et ikke-negativt heltal fra 0 til 9, der angiver hvilket underudtryk i pattern skal returneres af funktionen. Dette argument fungerer på samme måde, som når det bruges med REGEXP_INSTR() fungere. Se Oracles dokumentation for den funktion for flere oplysninger.

Eksempel

Her er et grundlæggende eksempel på brug af REGEXP_SUBSTR() i Oracle:

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

Resultat:

hund

I dette tilfælde er der et match, og den første (og i dette tilfælde kun) matchende understreng returneres.

Regulære udtryk kan være meget kraftfulde, og dette eksempel bruger et meget simpelt eksempel. For at bruge REGEXP_SUBSTR() effektivt, skal du kende det korrekte mønster til at bruge til det ønskede resultat.

Ingen match

Her er et eksempel, hvor der ikke er nogen match:

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

Resultat:

null

Der er ingen match, så null er returneret.

Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når null opstår som et resultat af en SQL SELECT udmelding.

Du kan dog bruge SET NULL for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null skal returneres.

Flere match

Her er et eksempel med flere matches:

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

Resultat:

hund

Du kan dog angive, hvilken forekomst der skal erstattes, hvis det kræves:

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

Resultat:

dag

Bemærk, at jeg tilføjede to argumenter her; 1 og 2 . 1 angiver opholdssted i strengen for at starte søgningen (i dette tilfælde ved det første tegn). 2 er det, der specificerer, hvilken forekomst der skal søges efter. I dette tilfælde søges der efter den anden forekomst.

Her er, hvad der sker, hvis jeg starter søgningen efter den første forekomst:

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

Resultat:

null

I dette tilfælde er der ingen match, fordi der kun er én forekomst mere efter startpositionen.

Hvis jeg ændrer det sidste argument til 1 , så får vi et match (fordi det er den første forekomst efter den angivne startposition):

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

Resultat:

dag

Skrivar og bogstaver

REGEXP_SUBSTR() funktionen følger Oracles sorteringsbestemmelse og afledningsregler, som definerer den sortering, der skal bruges, når strengen matches med mønsteret.

Du kan dog udtrykkeligt angive følsomhed mellem store og små bogstaver med det valgfri femte argument. Når du gør dette, tilsidesætter det enhver følsomhed mellem store og små bogstaver eller accentfølsomhed for den bestemte sortering.

Du kan angive i til forskellen mellem store og små bogstaver og c for store og små bogstaver.

Her er et eksempel:

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; 

Resultat:

 Default Uafhængig af store og små bogstaver. 

Min sortering ser ud til at skelne mellem store og små bogstaver, baseret på disse resultater. De to andre strenge blev tvunget til en matchning, der skelner mellem store og små bogstaver, og en matchning, der skelner mellem store og små bogstaver.

Underudtryk

Her er et eksempel på brug af det sjette argument til at returnere et specifikt underudtryksmønster:

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

Resultat:

kat

I dette tilfælde returnerede jeg det første underudtryk.

Her er, hvad der sker, hvis jeg angiver det tredje underudtryk:

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

Resultat:

ko

Nul-argumenter

Hvis et argument er null , resultatet er 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; 

Resultat:

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

Forkert antal argumenter

Hvis der ikke sendes nogen argumenter til funktionen, eller for få, resulterer det i en fejl:

SELECT REGEXP_SUBSTR()
FROM DUAL; 

Resultat:

Fejl starter på linje :1 i kommando -SELECT REGEXP_SUBSTR()FROM DUAL Fejl på kommandolinje :1 Kolonne :8Fejlrapport -SQL-fejl:ORA-00938:ikke nok argumenter til funktion00938. 00000 - "ikke nok argumenter for funktion"*Årsag:*Handling:

Det samme gælder, når vi sender for mange argumenter:

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

Resultat:

Fejl starter på linje:1 i kommando -SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'ups')FRA DUALEfejl på kommandolinje:1 Kolonne:8Fejlrapport -SQL-fejl:ORA-00939:for mange argumenter til funktion00939. 00000 - "for mange argumenter for funktion"*Årsag:*Handling:

Flere oplysninger

REGEXP_SUBSTR() funktion (såvel som Oracles øvrige implementering af regulære udtryk) er i overensstemmelse med IEEE Portable Operating System Interface (POSIX) regulære udtryksstandard og Unicode Regular Expression Guidelines fra Unicode Consortium.

Se Oracle-dokumentationen for mere information og eksempler på REGEXP_SUBSTR() funktion.


  1. Embedded Postgres til fjederstøvletest

  2. Erstatning af tekst i en BLOB-kolonne

  3. Sådan finder du navnet på en begrænsning i SQL Server

  4. Hvilke kolonner giver generelt gode indekser?