Používejte funkce regulárních výrazů v Fabric Data Warehouse

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_expression přijímá typy řetězců znaků. Podporovány jsou velké hodnoty (varchar(max)) až do 2 MB.
  • Argument pattern_expression podporuje 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říznaky i a c místo spoléhání se na kolaci sloupce. Další informace najdete v tématu Kolace datového skladu.
  • REGEXP_LIKE vrací Booleovskou hodnotu a nelze ji vrátit přímo jako sloupec. Pro vrácení výsledku jako sloupce ho zabalte do výrazu CASE .

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