Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:✅ Koncový bod analýzy SQL a datový sklad v Microsoft Fabric
Funkce regulárních výrazů (regex) vám umožní porovnávat složité textové vzory a přímo manipulovat s řetězcovými daty ve vašich T-SQL dotazech. Použijte je k ověření formátů, extrakci hodnot ze polostrukturovaného textu, počítání výskytů vzorů a čištění nebo maskování dat bez jejich přesunu ze skladu.
Note
Regulární výrazy jsou momentálně ve verzi náhledu.
Warehouse a SQL analytics endpoint podporují skalární regulární výrazové funkce. Každá z těchto funkcí vrací jednu hodnotu na vstupní řádek, takže je můžete použít v seznamech a výrazech SELECT, WHERE, JOIN, GROUP BY, ORDER BY a CASE.
Note
Ve Warehouse jsou dostupné pouze skalární regulární výrazové funkce. Tabulkové funkce REGEXP_MATCHES a REGEXP_SPLIT_TO_TABLE nejsou podporovány.
Podporované funkce
| Funkce | Návratový typ | Description |
|---|---|---|
| REGEXP_LIKE | logický | Označuje, zda textový vstup odpovídá regex vzoru. Použijte ho jako predikát, například v klauzi WHERE nebo výrazu CASE. |
| REGEXP_REPLACE | Řetězcový výraz | Vrátí zdrojový řetězec s výskyty vzoru regex nahrazenými náhradním řetězcem. Pokud nejsou nalezeny shody, vrátí původní řetězec. |
| REGEXP_SUBSTR | Řetězcový výraz | Vrací n-tývýskyt podřetězce, který odpovídá regex vzoru. |
| REGEXP_INSTR | int |
Vrátí počáteční nebo koncovou pozici spárovaného podřetězce. |
| REGEXP_COUNT | int |
Vrací početkrát, kdy se regex vzor vyskytuje v řetězci. |
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 ] ] )
Pro úplný popis každého argumentu viz odkaz na referenci funkce v sekci Podporované funkce.
Flags
Volitelný argument flags je hodnota varchar nebo char o délce až 30 znaků, která nastavuje modifikátory shody. Pokud uvedete protichůdné přepínače, vyhrává ten poslední. Například výsledkem 'ic' je porovnávání rozlišující velká a malá písmena.
| Flag | Description |
|---|---|
c |
Porovnávání s rozlišováním velkých a malých písmen. Toto je výchozí hodnota. |
i |
Porovnávání nerozlišující malá a velká písmena. |
m |
Režim více řádků: ^ a $ odpovídají začátku a konci každého řádku i začátku a konci textu. |
s |
Nechť . odpovídá znaku nového řádku \n. |
Considerations
- Argument
string_expressionpřijímá typy řetězců znaků. Podporovány jsou velké hodnoty (varchar(max)) až do 2 MB. - Argument
pattern_expressionpodporuje maximální délku 8 000 bajtů. - Funkce regulárních výrazů nerespektují pravidla třídění. Párování se může lišit od jiných porovnání řetězců, například
LIKE. K ovládání rozlišování velikosti písmen použijte příznakyiacmísto spoléhání se na kolaci sloupce. Další informace najdete v tématu Kolace datového skladu. -
REGEXP_LIKEvrací Booleovskou hodnotu a nelze ji vrátit přímo jako sloupec. Pro vrácení výsledku jako sloupce ho zabalte do výrazuCASE.
Examples
Následující příklady používají malou inline datovou sadu, takže je můžete spustit v jakémkoli skladu nebo SQL analytickém endpointu.
A. Filtrovat řádky, které odpovídají vzoru
Použijte REGEXP_LIKE v klauzuli WHERE pro vrácení pouze řádků s platným formátem e-mailové adresy.
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,}$');
Chcete-li vrátit výsledek shody jako sloupec, zabalte REGEXP_LIKE do výrazu CASE:
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. Extrahujte hodnotu z textu
Použijte REGEXP_SUBSTR k extrakci prvního čísla objednávky ve formátu ORD- následovaném číslicemi z komentáře ve volném textu.
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);
Pro získání pouze části shody použijte skupinu pro zachycení. Následující dotaz vrací doménu každé e-mailové adresy:
SELECT REGEXP_SUBSTR(Email, '@(.+)$', 1, 1, 'c', 1) AS EmailDomain
FROM (VALUES ('anna@contoso.com'), ('bob@fabrikam.org')) AS c (Email);
C. Počet výskytů vzoru
Použijte REGEXP_COUNT k počítání, kolik čísel se objeví v každém řetězci.
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. Najděte pozici shody
Použijte REGEXP_INSTR k nalezení výchozí a koncové pozice první posloupnosti číslic.
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. Vyčistit a maskovat data
Pomocí REGEXP_REPLACE lze standardizovat telefonní čísla pomocí skupin pro zachycení a maskovat všechny kromě posledních čtyř číslic.
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);
Následující dotaz shrnuje opakované mezery do jedné mezery:
SELECT REGEXP_REPLACE('Fabric Data Warehouse', '\s+', ' ') AS CleanText;
F. Seskupte a agregujte podle extrahované hodnoty
Protože funkce jsou skalární, můžete je použít ve GROUP BY klauzulích. Následující dotaz počítá zákazníky podle e-mailové domény.
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));