Brug regulære udtryksfunktioner i Fabric data warehouse

Gælder for:✅ SQL Analytics-slutpunkt og warehouse i Microsoft Fabric

Regulære udtryk (regex) funktioner lader dig matche komplekse tekstmønstre og manipulere strengdata direkte i dine T-SQL-forespørgsler. Brug dem til at validere formater, udtrække værdier fra semistruktureret tekst, tælle mønsterforekomster og rense eller maskere data uden at flytte dem ud af lageret.

Note

Regulære udtryk er i øjeblikket i forhåndsvisning.

Warehouse og SQL-analyse-endpointet understøtter de skalare regulære udtryksfunktioner. Hver af disse funktioner returnerer én værdi pr. inputrække, så du kan bruge dem i SELECT listen, WHERE, JOIN, GROUP BY, ORDER BY, og CASE udtryk.

Note

Kun skalare regulære udtryksfunktioner er tilgængelige i Warehouse. De tabelværdiede funktioner REGEXP_MATCHES og REGEXP_SPLIT_TO_TABLE understøttes ikke.

Understøttede funktioner

Funktion Returntype Beskrivende tekst
REGEXP_LIKE Boolean Angiver om tekstinputtet matcher regex-mønsteret. Brug det som et prædikat, for eksempel i en WHERE sætning eller et CASE udtryk.
REGEXP_REPLACE Strengudtryk Returnerer kildestrengen med forekomster af regex-mønsteret erstattet af en erstatningsstreng. Hvis der ikke findes match, returnerer den oprindelige streng.
REGEXP_SUBSTR Strengudtryk Returnerer den n-teforekomst af en delstreng, der matcher regex-mønsteret.
REGEXP_INSTR int Returnerer start- eller slutpositionen for den matchede delstreng.
REGEXP_COUNT int Returnerer antallet af gange, regex-mønsteret forekommer i en streng.

Syntaks

REGEXP_LIKE ( string_expression, pattern_expression [ , flags ] )

REGEXP_REPLACE ( string_expression, pattern_expression [ , string_replacement [ , start [ , occurrence [ , flags ] ] ] ] )

REGEXP_SUBSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , flags [ , group ] ] ] ] )

REGEXP_INSTR ( string_expression, pattern_expression [ , start [ , occurrence [ , return_option [ , flags [ , group ] ] ] ] ] )

REGEXP_COUNT ( string_expression, pattern_expression [ , start [ , flags ] ] )

For en fuld beskrivelse af hvert argument, se referencen til den linkede funktion i Understøttede funktioner.

Flag

Det valgfrie flags argument er en char eller værdi varchar på op til 30 tegn, der sætter matchende modifikatorer. Hvis du giver modstridende flag, vinder det sidste. For eksempel 'ic' resulterer i småbogstavsfølsom matchning.

Flag Beskrivende tekst
c Tilpasning med små og små bogstaver. Dette er standarden.
i Matching uden store og små bogstader.
m Multilinje-tilstand: ^ og $ match begyndelsen og slutningen af hver linje samt begyndelsen og slutningen af teksten.
s Lad os . matche linjeskiftet .\n

Overvejelser

  • Argumentet string_expression accepterer tegnstrengstyper. Store værdier (varchar(max)) understøttes op til 2 MB.
  • Argumentet pattern_expression understøtter en maksimal længde på 8.000 bytes.
  • Regulære udtryksfunktioner respekterer ikke kollationsreglerne. Matching kan adskille sig fra andre strengsammenligninger, såsom LIKE. For at kontrollere kasusfølsomhed skal du bruge i og-flagene c i stedet for at stole på kolonne-kollationen. For mere information, se data warehouse collation.
  • REGEXP_LIKE returnerer en boolesk værdi og kan ikke returneres direkte som en kolonne. For at returnere resultatet som en kolonne, indpakk det i et CASE udtryk.

Eksempler

Følgende eksempler bruger et lille inline datasæt, så du kan køre dem i ethvert lager eller SQL-analyse-endpoint.

A. Filtrer rækker, der matcher et mønster

Brug REGEXP_LIKE i en WHERE klausul til kun at returnere rækker med gyldigt e-mailadresseformat.

SELECT CustomerId, Email
FROM (VALUES
        (1, 'anna@contoso.com'),
        (2, 'not-an-email'),
        (3, 'Bob.Smith@Fabrikam.org')
     ) AS c (CustomerId, Email)
WHERE REGEXP_LIKE(Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

For at returnere matchresultatet som en kolonne, indpakk REGEXP_LIKE et CASE udtryk:

SELECT Email,
       CASE WHEN REGEXP_LIKE(Email, '@contoso\.com$', 'i') THEN 'Internal' ELSE 'External' END AS EmailType
FROM (VALUES ('anna@CONTOSO.com'), ('bob@fabrikam.org')) AS c (Email);

B. Udtræk en værdi fra tekst

Brug REGEXP_SUBSTR til at udtrække det første ordrenummer i formatet ORD- efterfulgt af cifre fra en fritekstkommentar.

SELECT Comment,
       REGEXP_SUBSTR(Comment, 'ORD-\d+') AS OrderNumber
FROM (VALUES
        ('Customer called about ORD-10293 and ORD-10311.'),
        ('No order referenced.')
     ) AS t (Comment);

For kun at udtrække en del af kampen, brug en fangstgruppe. Følgende forespørgsel returnerer domænet for hver e-mailadresse:

SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);

C. Forekomster af tællemønstre

Brug REGEXP_COUNT den til at tælle, hvor mange tal der optræder i hver streng.

SELECT Comment,
       REGEXP_COUNT(Comment, '\d+') AS NumberCount
FROM (VALUES
        ('Shipped 3 boxes on 12 May, invoice 4471.'),
        ('No numbers here.')
     ) AS t (Comment);

D. Find placeringen af en match

Brug REGEXP_INSTR den til at finde startpositionen og slutpositionen for den første sekvens af cifre.

SELECT ProductCode,
       REGEXP_INSTR(ProductCode, '\d+')             AS FirstDigitStart,
       REGEXP_INSTR(ProductCode, '\d+', 1, 1, 1)    AS FirstDigitEnd
FROM (VALUES ('BK-R93R-62'), ('HL-U509')) AS p (ProductCode);

E. Rens og masker data

Brug REGEXP_REPLACE til at standardisere telefonnumre med capture-grupper og til at maskere alle undtagen de sidste fire cifre.

SELECT Phone,
       REGEXP_REPLACE(Phone, '^(\d{3})-(\d{3})-(\d{4})$', '(\1) \2-\3') AS FormattedPhone,
       REGEXP_REPLACE(Phone, '^\d{3}-\d{3}', '***-***')               AS MaskedPhone
FROM (VALUES ('425-555-0187'), ('206-555-0142')) AS c (Phone);

Følgende forespørgsel samler gentaget hvidrum til ét enkelt mellemrum:

SELECT REGEXP_REPLACE('Fabric    Data   Warehouse', '\s+', ' ') AS CleanText;

F. Gruppere og aggregere med en udtrukket værdi

Fordi funktionerne er skalar, kan du bruge dem i GROUP BY klausuler. Følgende forespørgsel tæller kunder pr. e-maildomæne.

SELECT LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1)) AS EmailDomain,
       COUNT(*) AS Customers
FROM (VALUES
        ('anna@contoso.com'),
        ('bob@Contoso.com'),
        ('chris@fabrikam.org')
     ) AS c (Email)
GROUP BY LOWER(REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1));