Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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_expressionaccepterar teckensträngstyper. Stora värden (varchar(max)) stöds upp till 2 MB. - Argumentet
pattern_expressionstö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ändiochc-flaggorna istället för att förlita dig på kolumnens sorteringsordning. Mer information finns i Sortering av informationslager. -
REGEXP_LIKEreturnerar ett booleskt värde och kan inte returneras direkt som en kolumn. För att returnera resultatet som en kolumn, omslut det med ettCASEuttryck.
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));