Nye SQL-funktioner regexp_like og regexp_count

Regulære udtryk kan nu også bruges som en betingelse og som en tæller.

Invantive UniversalSQL er blevet udvidet med SQL-funktionerne regexp_like og regexp_count. Med disse funktioner er samlingen af regulære-udtryksfunktioner komplet: udover regexp_instr, regexp_replace og regexp_substr besvarer regexp_like spørgsmålet om, hvorvidt et mønster forekommer, og regexp_count tæller, hvor ofte det sker.

regexp_like

Funktionen regexp_like besvarer, om et mønster forekommer i en værdi. Formen er:

regexp_like(value, pattern [, start_position [, match_parameter]])

Svaret er true, hvis mønstret forekommer, og false, hvis det ikke gør. Hvis værdien eller mønsteret er tomt, er svaret tomt. Funktionen er beregnet til en where-klausul, men kan også anvendes som en kolonne i en select.

regexp_count

Funktionen regexp_count tæller, hvor ofte et mønster forekommer i en værdi. Formen er:

regexp_count(value, pattern [, start_position [, match_parameter]])

Svaret er 0, hvis mønstret ikke forekommer, og tomt, hvis værdien eller mønstret er tomt. Forekomsterne overlapper ikke hinanden: søgningen efter den næste forekomst fortsætter efter slutningen af den forrige. For eksempel forekommer aa en gang i aaa og ikke to gange.

Startposition og match_parameter

Begge funktioner har de samme to valgfrie parametre. Startpositionen tælles fra 1 og er standard 1; søgningen begynder der i stedet for i starten.

match_parameter styrer måden at sammenligne på og accepterer c, i, n, m og x. Uden denne parameter søges der på store og små bogstaver. Hvis både c og i er angivet, gælder den sidste af de to; dette var tidligere ikke muligt og fungerer nu ens for alle fem funktioner.

Mønsteret følger reglerne for regulære udtryk i Invantive UniversalSQL, som beskrevet ved de individuelle funktioner under Se også.

Eksempel: filtrering og optælling af koder

Det følgende eksempel er direkte eksekverbart og bruger begge funktioner samtidigt: regexp_like vælger de artikelkoder, der består af to store bogstaver, en bindestreg og fire cifre, og regexp_count tæller cifrene i disse koder.

create or replace table artikelcodes@InMemoryStorage
as
select 'NL-1234' code
union all
select 'BE-5678' code
union all
select 'losse tekst' code
;
select ace.code
,      regexp_count(ace.code, '[0-9]') cifre
from   artikelcodes@InMemoryStorage ace
where  regexp_like(ace.code, '^[A-Z]{2}-[0-9]{4}$')
order
by     ace.code

Udfaldet er:

CODE         CIFRE
-----------  -------
BE-5678            4
NL-1234            4

Rækken losse tekst opfylder ikke mønstret og bliver derfor udeladt.

Eksempel: ignorering af store bogstaver

Det næste eksempel viser forskellen, som match_parameter gør:

select regexp_like('INVANTIVE', 'van') storefølsom
,      regexp_like('INVANTIVE', 'van', 1, 'i') ufølsom

Udfaldet er:

STOREFÖLSOM  UFÖLSOM
-------------------  ----------
False                True

Se også

Tilgængelighed

Den nye funktionalitet er tilgængelig fra version 27.0.