Bruk regulære uttrykksfunksjoner i Fabric datalager

Gjelder for:✅ SQL Analytics-endepunkt og Warehouse i Microsoft Fabric

Regulære uttrykk (regex)-funksjoner lar deg matche komplekse tekstmønstre og manipulere strengdata direkte i T-SQL-spørringene dine. Bruk dem til å validere formater, trekke ut verdier fra semistrukturert tekst, telle mønsterforekomster, og rense eller maskere data uten å flytte dem ut av lageret.

Note

Regulære uttrykk er for øyeblikket i forhåndsvisning.

Warehouse og SQL-analyse-endepunktet støtter de skalare regulære uttrykksfunksjonene. Hver av disse funksjonene returnerer én verdi per inngangsrad, så du kan bruke dem i SELECT listen, WHERE, JOIN, GROUP BY, ORDER BY, og CASE uttrykkene.

Note

Kun skalare regulære uttrykksfunksjoner er tilgjengelige i Warehouse. Tabell-funksjonene REGEXP_MATCHES og REGEXP_SPLIT_TO_TABLE støttes ikke.

Funksjoner som støttes

Funksjonen Returtype Description
REGEXP_LIKE boolsk Indikerer om tekstinputen samsvarer med regex-mønsteret. Bruk det som et predikat, for eksempel i en WHERE setning eller et CASE uttrykk.
REGEXP_REPLACE Strenguttrykk Returnerer kildestrengen med forekomster av regex-mønsteret erstattet av en erstatningsstreng. Hvis ingen treff finnes, returnerer den opprinnelige strengen.
REGEXP_SUBSTR Strenguttrykk Returnerer den n-teforekomsten av en delstreng som matcher regex-mønsteret.
REGEXP_INSTR int Returnerer start- eller sluttposisjonen til den matchede delstrengen.
REGEXP_COUNT int Returnerer antall ganger 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 fullstendig beskrivelse av hvert argument, se referansen for lenket funksjon i Støttede funksjoner.

Flagg

Det valgfrie flags argumentet er en char eller varchar verdi på opptil 30 tegn som setter matchende modifikatorer. Hvis du gir motstridende flagg, vinner det siste. For eksempel 'ic' resulterer i mellombokstavsfølsom matching.

Flagg Description
c Case-sensitiv matching. Dette er standard.
i Tilpasning uten mellombokstaver.
m Flerlinjemodus: ^ og $ matcher begynnelsen og slutten av hver linje, i tillegg til begynnelsen og slutten av teksten.
s La oss . matche linjeskiftet \n.

Vurderinger

  • Argumentet aksepterer string_expression typer tegnstrenger. Store verdier (varchar(max)) støttes opptil 2 MB.
  • Argumentet pattern_expression støtter en maksimal lengde på 8 000 byte.
  • Regulære uttrykksfunksjoner respekterer ikke kollasjonsregler. Matching kan skille seg fra andre strengsammenligninger, som LIKE. For å kontrollere kasusfølsomhet, bruk i og-flaggene c i stedet for å stole på kolonne-kollasjonen. For mer informasjon, se datalager collation.
  • REGEXP_LIKE returnerer en boolsk verdi og kan ikke returneres direkte som en kolonne. For å returnere resultatet som en kolonne, pakk det inn i et CASE uttrykk.

Eksempler

Følgende eksempler bruker et lite innebygd datasett, slik at du kan kjøre dem i hvilket som helst lager eller SQL-analyseendepunkt.

A. Filterrader som matcher et mønster

Bruk REGEXP_LIKE i en WHERE klausul for å returnere kun rader med gyldig e-postadresseformat.

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 å returnere matchresultatet som en kolonne, pakk REGEXP_LIKE inn et CASE uttrykk:

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. Trekk ut en verdi fra tekst

Bruk REGEXP_SUBSTR for å hente ut det første ordensnummeret i formatet ORD- etterfulgt av sifre 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 å hente ut bare deler av matchen, bruk en capture group. Følgende spørring gir domenet til hver e-postadresse:

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

C. Forekomster av tellemønstre

Bruk REGEXP_COUNT den til å telle hvor mange tall som dukker opp 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. Finn posisjonen til en kamp

Bruk REGEXP_INSTR for å finne startposisjonen og sluttposisjonen til den første sekvensen av sifre.

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

Bruk REGEXP_REPLACE for å standardisere telefonnumre med opptaksgrupper, og for å maskere alle unntatt de siste fire sifrene.

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 spørring samler gjentatt hvitrom til ett enkelt mellomrom:

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

F. Gruppere og aggregere med en utvunnet verdi

Fordi funksjonene er skalariske, kan du bruke dem i GROUP BY klausuler. Følgende spørring teller kunder per e-postdomene.

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));