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.