Use funções de expressão regular no Fabric Data Warehouse

Aplica-se a:✅ Endpoint de análise de SQL e Armazém de Dados no Microsoft Fabric

Funções de expressão regular (regex) permitem que você combine padrões de texto complexos e manipule dados de strings diretamente em suas consultas T-SQL. Use esses recursos para validar formatos, extrair valores de texto semi-estruturado, contar ocorrências de padrões e limpar ou mascarar dados sem movê-los do data warehouse.

Note

Expressões regulares estão atualmente em versão prévia.

Warehouse e o endpoint de análise SQL suportam as funções de expressão regular escalar. Cada uma dessas funções retorna um valor por linha de entrada, então você pode usá-las na lista SELECT, WHERE, JOIN, GROUP BY, ORDER BY, e CASE expressões.

Note

Apenas funções de expressão regular escalar estão disponíveis no Warehouse. As funções com valores de tabela REGEXP_MATCHES e REGEXP_SPLIT_TO_TABLE não são suportadas.

Funções suportadas

Function Tipo de retorno Description
REGEXP_LIKE booleano Indica se a entrada de texto corresponde ao padrão regex. Use isso como predicado, por exemplo, em uma cláusula WHERE ou expressão CASE.
REGEXP_REPLACE Expressão de cadeia de caracteres Retorna a string de origem com ocorrências do padrão regex substituídas por uma string de reposição. Se não houver correspondências, retorna a cadeia original.
REGEXP_SUBSTR Expressão de cadeia de caracteres Retorna a nocorrência de uma substring que corresponde ao padrão regex.
REGEXP_INSTR int Retorna a posição inicial ou final da substring correspondente.
REGEXP_COUNT int Retorna o número de vezes que o padrão regex ocorre em uma string.

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

Para uma descrição completa de cada argumento, veja a referência à função vinculada em Funções suportadas.

Sinalizadores

O argumento opcional flags é um valor char ou varchar de até 30 caracteres que define os modificadores correspondentes. Se você fornecer flags contraditórias, a última vence. Por exemplo, 'ic' resulta em correspondência sensível a maiúsculas minúsculas.

Flag Description
c Correspondência que diferencia maiúsculas de minúsculas. Este é o padrão.
i Correspondência sem diferenciação entre maiúsculas e minúsculas.
m Modo multi-linha: ^ e $ correspondem ao início e ao fim de cada linha, além do início e do fim do texto.
s Vamos . corresponder ao caractere \n de nova linha.

Considerations

  • O string_expression argumento aceita tipos de sequências de caracteres. Valores grandes (varchar(max)) são suportados até 2 MB.
  • O pattern_expression argumento suporta um comprimento máximo de 8.000 bytes.
  • Funções de expressão regular não respeitam as regras de ordenação. A correspondência pode diferir de outras comparações de cadeias, como LIKE. Para controlar a diferenciação entre maiúsculas e minúsculas, use os sinalizadores i e c em vez de depender da regra de ordenação da coluna. Para obter mais informações, consulte a ordenação do Data Warehouse.
  • REGEXP_LIKE retorna um valor booleano e não pode ser retornado diretamente como coluna. Para retornar o resultado como uma coluna, envolva-o em uma CASE expressão.

Exemplos

Os exemplos a seguir usam um pequeno conjunto de dados inline, então você pode rodá-los em qualquer warehouse ou endpoint de análise SQL.

A. Filtre as linhas que correspondem a um padrão

Use REGEXP_LIKE em uma cláusula WHERE para devolver apenas linhas com um formato de endereço de e-mail válido.

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

Para retornar o resultado da correspondência como uma coluna, envolva REGEXP_LIKE em uma expressão 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. Extrair um valor do texto

Use REGEXP_SUBSTR para extrair o primeiro número de pedido no formato ORD- seguido de dígitos de um comentário em texto livre.

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

Para extrair apenas parte da correspondência, use um grupo de captura. A consulta a seguir retorna o domínio de cada endereço de e-mail:

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

C. Contar ocorrências de padrões

Use REGEXP_COUNT para contar quantos números aparecem em cada sequência.

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. Encontre a posição de uma ocorrência

Use REGEXP_INSTR para encontrar a posição inicial e a posição final da primeira sequência de dígitos.

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. Limpar e mascarar dados

Use REGEXP_REPLACE para padronizar números de telefone com grupos de captura e para mascarar todos, exceto os quatro últimos dígitos.

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

A consulta a seguir colapsa o espaço em branco repetido em um único espaço:

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

F. Agrupar e agregar por um valor extraído

Como as funções são escalares, você pode usá-las em cláusulas GROUP BY. A consulta a seguir conta os clientes por domínio de e-mail.

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