Använd reguljära uttrycksfunktioner i Fabric Data Warehouse

Gäller för:✅ SQL-analysslutpunkt och lager i Microsoft Fabric

Reguljära uttryck (regex) låter dig matcha komplexa textmönster och manipulera strängdata direkt i dina T-SQL-frågor. Använd dem för att validera format, extrahera värden från semistrukturerad text, räkna mönsterförekomster och rensa eller maskera data utan att flytta ut den ur lagret.

Note

Reguljära uttryck är för närvarande i förhandsvisning.

Warehouse och SQL-analysändpunkten stöder de skalära reguljära uttrycksfunktionerna. Var och en av dessa funktioner returnerar ett värde per inmatningsrad, så du kan använda dem i SELECT listan, WHERE, JOIN, GROUP BY, ORDER BY, och CASE uttrycken.

Note

Endast skalära reguljära uttrycksfunktioner finns tillgängliga i Warehouse. Tabellvärdesfunktionerna REGEXP_MATCHES och REGEXP_SPLIT_TO_TABLE stöds inte.

Funktioner som stöds

Funktion Returtyp Description
REGEXP_LIKE Boolean Anger om textinmatningen matchar regex-mönstret. Använd det som ett predikat, till exempel i en WHERE sats eller i ett CASE uttryck.
REGEXP_REPLACE stränguttryck Returnerar källsträngen där förekomster av regex-mönstret ersätts av en ersättningssträng. Om inga träffar hittas, returnerar den ursprungliga strängen.
REGEXP_SUBSTR Strängexpression Returnerar den n:te förekomsten av en delsträng som matchar regex-mönstret.
REGEXP_INSTR int Returnerar start- eller slutpositionen för den matchade delsträngen.
REGEXP_COUNT int Returnerar antalet gånger regex-mönstret förekommer i en sträng.

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

För en fullständig beskrivning av varje argument, se referensen för länkad funktion i Stödda funktioner.

Flaggor

Det valfria flags argumentet är ett char eller varchar värde på upp till 30 tecken som anger matchningsmodifierarna. Om du ger motstridiga flaggor vinner den sista. Till exempel resulterar 'ic' i kasuskänslig matchning.

Flagga Description
c Skiftlägeskänslig matchning. Det här är standardinställningen.
i Skiftlägesokänslig matchning.
m Flerradsläge: ^ och $ matchar början och slutet av varje rad, utöver början och slutet av texten.
s Låt oss . matcha radskiftet \n.

Considerations

  • Argumentet string_expression accepterar teckensträngstyper. Stora värden (varchar(max)) stöds upp till 2 MB.
  • Argumentet pattern_expression stöder en maximal längd på 8 000 byte.
  • Reguljära uttrycksfunktioner respekterar inte sorteringsordningsregler. Matchning kan skilja sig från andra strängjämförelser, såsom LIKE. För att kontrollera skiftlägeskänslighet, använd i och c-flaggorna istället för att förlita dig på kolumnens sorteringsordning. Mer information finns i Sortering av informationslager.
  • REGEXP_LIKE returnerar ett booleskt värde och kan inte returneras direkt som en kolumn. För att returnera resultatet som en kolumn, omslut det med ett CASE uttryck.

Examples

Följande exempel använder en liten inline-datamängd, så du kan köra dem i vilket datavarulager eller SQL-analysändpunkt som helst.

A. Filtrera rader som matchar ett mönster

Använd REGEXP_LIKE i en WHERE klausul för att returnera endast rader med ett giltigt e-postadressmönster.

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

För att returnera matchningsresultatet som en kolumn, slå in REGEXP_LIKE i ett CASE-uttryck:

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. Extrahera ett värde från text

Använd REGEXP_SUBSTR för att extrahera det första ordernumret i formatet ORD- följt av siffror från en fritextkommentar.

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

För att bara extrahera en del av matchen, använd en capture group. Följande fråga returnerar domänen för varje e-postadress:

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

C. Räkna mönsterförekomster

Använd REGEXP_COUNT för att räkna hur många siffror som förekommer i varje sträng.

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. Hitta positionen för en träff

Använd REGEXP_INSTR för att hitta startpositionen och slutpositionen för den första sekvensen av siffror.

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. Rensa och maskera data

Använd REGEXP_REPLACE för att standardisera telefonnummer med fångstgrupper och maskera alla utom de sista fyra siffrorna.

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öljande sökfråga sammanfattar upprepat vitutrymme till ett enda mellanrum:

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

F. Gruppera och aggregera utifrån ett extraherat värde

Eftersom funktionerna är skalära kan du använda dem i GROUP BY-satser. Följande fråga räknar kunder per e-postdomän.

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