Utiliza funciones de expresión regular en Fabric Data Warehouse

Aplicable a:✅ Punto final de análisis SQL y Almacén en Microsoft Fabric

Las funciones de expresión regular (regex) te permiten emparejar patrones de texto complejos y manipular datos de cadenas directamente en tus consultas T-SQL. Úsalos para validar formatos, extraer valores de texto semiestructurado, contar ocurrencias de patrones y limpiar o enmascarar datos sin moverlos fuera del almacén.

Note

Las expresiones regulares están actualmente en vista previa.

Warehouse y el punto de conexión de análisis de SQL admiten las funciones de expresión regular escalar. Cada una de estas funciones devuelve un valor por fila de entrada, por lo que puedes usarlas en las expresiones SELECT, WHERE, JOIN, GROUP BY, ORDER BY y CASE.

Note

Solo están disponibles funciones de expresión regular escalar en Warehouse. Las funciones con valores de tabla REGEXP_MATCHES y REGEXP_SPLIT_TO_TABLE no están soportadas.

Funciones compatibles

Function Tipo de retorno Description
REGEXP_LIKE Boolean Indica si la entrada de texto coincide con el patrón regex. Úsalo como predicado, por ejemplo en una cláusula WHERE o una expresión CASE.
REGEXP_REPLACE Expresión de cadena Devuelve la cadena fuente con las ocurrencias del patrón regex reemplazadas por una cadena de reemplazo. Si no se encuentran coincidencias, devuelve la cadena original.
REGEXP_SUBSTR Expresión de cadena Devuelve la naparición de una subcadena que coincide con el patrón regex.
REGEXP_INSTR int Devuelve la posición inicial o final de la subcadena emparejada.
REGEXP_COUNT int Devuelve el número de veces que el patrón regex aparece en una cadena.

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 una descripción completa de cada argumento, véase la referencia de la función enlazada en Funciones soportadas.

Flags

El argumento opcional flags es un valor char o varchar de hasta 30 caracteres que establece los modificadores correspondientes. Si pones banderas contradictorias, gana la última. Por ejemplo, 'ic' resulta en emparejamiento sensible a mayúsculas y minúsculas.

Flag Description
c Coincidencia con distinción entre mayúsculas y minúsculas. Este es el valor predeterminado.
i Coincidencia sin distinción entre mayúsculas y minúsculas.
m Modo de varias líneas: ^ y $ coinciden con el principio y el final de cada línea, además del principio y el final del texto.
s Permite que . coincida con el carácter \n de nueva línea.

Considerations

  • El string_expression argumento acepta tipos de cadenas de caracteres. Se admiten valores grandes (varchar(max)) hasta 2 MB.
  • El argumento pattern_expression admite una longitud máxima de 8.000 bytes.
  • Las funciones de expresión regular no respetan las reglas de intercalación. El emparejamiento puede diferir de otras comparaciones de cadenas, como LIKE. Para controlar la sensibilidad a mayúsculas y minúsculas, utiliza las banderas i y c en lugar de depender del cotejamiento de la columna. Para obtener más información, vea intercalación de almacén de datos.
  • REGEXP_LIKE devuelve un valor booleano y no puede devolverse directamente como columna. Para devolver el resultado como columna, envuélvelo en una CASE expresión.

Examples

Los siguientes ejemplos utilizan un pequeño conjunto de datos insertado, así que puedes ejecutarlos en cualquier almacén o endpoint de analítica SQL.

A. Filtra las filas que coincidan con un patrón

Usa REGEXP_LIKE en una WHERE cláusula para devolver solo filas con un formato de correo electrónico 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 devolver el resultado de coincidencia como una columna, envuelva REGEXP_LIKE en una expresión 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. Extraer un valor del texto

Use REGEXP_SUBSTR para extraer el primer número de pedido en el formato ORD- seguido de dígitos de un comentario en texto libre.

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 extraer solo parte de la coincidencia, utiliza un grupo de captura. La siguiente consulta devuelve el dominio de cada dirección de correo electrónico:

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

C. Contar las coincidencias de patrones

Usa REGEXP_COUNT para contar cuántos números aparecen en cada cadena.

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. Encuentra la posición de una coincidencia

Use REGEXP_INSTR para encontrar la posición inicial y la posición final de la primera secuencia 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. Limpieza y enmascaramiento de datos

Usa REGEXP_REPLACE para estandarizar números de teléfono con grupos de captura y para enmascarar todos menos los cuatro ú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);

La siguiente consulta colapsa el espacio en blanco repetido en un solo espacio:

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

F. Agrupar y agregar por un valor extraído

Como las funciones son escalares, puedes usarlas en cláusulas GROUP BY. La siguiente consulta cuenta los clientes por dominio de correo electrónico.

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