Gebruik reguliere expressiefuncties in Fabric Data Warehouse

Van toepassing op:✅ SQL Analytics-eindpunt en -magazijn in Microsoft Fabric

Functies voor reguliere expressies (regex) laten je complexe tekstpatronen matchen en stringgegevens direct in je T-SQL-queries manipuleren. Gebruik ze om formaten te valideren, waarden uit semi-gestructureerde tekst te halen, patroonvoorkomsten te tellen en data te reinigen of te maskeren zonder deze uit het warehouse te verplaatsen.

Note

Reguliere expressies zijn momenteel in preview.

Warehouse en het SQL-analyse-eindpunt ondersteunen de scalaire reguliere expressiefuncties. Elk van deze functies geeft één waarde per invoerrij terug, dus je kunt ze gebruiken in de SELECT lijst, WHERE, JOIN, GROUP BY, , ORDER BYen CASE expressies.

Note

Alleen scalaire reguliere expressiefuncties zijn beschikbaar in Warehouse. De tabel-gewaardeerde functies REGEXP_MATCHES en REGEXP_SPLIT_TO_TABLE worden niet ondersteund.

Ondersteunde functies

Functie Terugbrengtype Description
REGEXP_LIKE Booleaanse Geeft aan of de tekstinvoer overeenkomt met het regex-patroon. Gebruik het als predicaat, bijvoorbeeld in een WHERE clausule of een CASE uitdrukking.
REGEXP_REPLACE String expression Geeft de bronstring terug waarbij voorkomens van het regex-patroon worden vervangen door een vervangende string. Als er geen overeenkomsten worden gevonden, wordt de originele string teruggegeven.
REGEXP_SUBSTR tekenreeks-expressie Geeft het n-devoorkomen van een substring terug die overeenkomt met het regex-patroon.
REGEXP_INSTR int Geeft de begin- of eindpositie van de gematchte substring terug.
REGEXP_COUNT int Geeft het aantal keren dat het regex-patroon voorkomt in een string terug.

Syntax

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

Voor een volledige beschrijving van elk argument, zie de gekoppelde functiereferentie in Ondersteunde functies.

Flags

Het optionele flags argument is een char of of varchar waarde tot 30 tekens die de matchingmodifiers bepaalt. Als je tegenstrijdige vlaggen aangeeft, wint de laatste. Bijvoorbeeld, 'ic' resulteert in hoofdlettergevoelige matching.

Flag Description
c Hoofdlettergevoelige overeenkomsten. Dit is de standaardwaarde.
i Hoofdletterongevoelige overeenkomsten.
m Multi-regelige modus: ^ en $ komen overeen met het begin en einde van elke regel, naast het begin en einde van de tekst.
s Laten we . het regelafbrekingsteken \n matchen.

Considerations

  • Het string_expression argument accepteert tekenreekstypes. Grote waarden (varchar(max)) worden ondersteund tot 2 MB.
  • Het pattern_expression argument ondersteunt een maximale lengte van 8.000 bytes.
  • Functies voor reguliere expressies houden zich niet aan de collatieregels. Matching kan verschillen van andere stringvergelijkingen, zoals LIKE. Om de hoofdlettergevoeligheid te regelen, gebruik je de i- en c-vlaggen in plaats van af te gaan op de kolomsortering. Zie Data Warehouse-sortering voor meer informatie.
  • REGEXP_LIKE geeft een Booleaanse waarde terug en kan niet direct als kolom worden teruggegeven. Om het resultaat als kolom terug te geven, wikkel je het in een CASE uitdrukking.

Examples

De volgende voorbeelden gebruiken een kleine inline dataset, zodat je ze in elk warehouse of elk SQL-analyse-endpoint kunt draaien.

A. Filter rijen die overeenkomen met een patroon

Gebruik REGEXP_LIKE in een WHERE-clausule om alleen rijen met een geldig e-mailadresformaat te retourneren.

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,}$');

Om het matchresultaat als kolom terug te geven, wikkel REGEXP_LIKE in een CASE-expressie:

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. Haal een waarde uit tekst

Gebruik REGEXP_SUBSTR om uit een vrijetekstcommentaar het eerste ordernummer te extraheren in de notatie ORD- gevolgd door cijfers.

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

Om slechts een deel van de match te extraheren, gebruik je een capture group. De volgende zoekopdracht geeft het domein van elk e-mailadres terug:

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

C. Patroonvoorkomens tellen

Gebruik REGEXP_COUNT om te tellen hoeveel getallen er in elke reeks voorkomen.

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. Vind de positie van een match

Gebruik REGEXP_INSTR om de beginpositie en de eindpositie van de eerste reeks cijfers te vinden.

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. Gegevens opschonen en maskeren

Gebruik REGEXP_REPLACE om telefoonnummers te standaardiseren met capture-groepen en om alle cijfers behalve de laatste vier cijfers te maskeren.

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

De volgende query vouwt herhaalde witruimte samen tot één ruimte:

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

F. Groeperen en aggregeren op basis van een geëxtraheerde waarde

Omdat de functies scalair zijn, kun je ze in GROUP BY clausules gebruiken. De volgende query telt klanten per e-maildomein.

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