sql >> Base de Datos >  >> RDS >> Sqlserver

¿Solución alternativa de expresiones regulares de SQL Server en T-SQL?

Desafortunadamente, no podrá mover sus funciones CLR a SQL Azure. Deberá usar las funciones de cadena normales (PATINDEX, CHARINDEX, LIKE, etc.) o realizar estas operaciones fuera de la base de datos.

EDITAR Agregando algo de información para los ejemplos agregados a la pregunta.

Dirección de correo electrónico

Este siempre es controvertido porque las personas no están de acuerdo sobre qué versión del RFC quieren admitir. El original no admitía apóstrofes, por ejemplo (o al menos la gente insiste en que no lo era; no lo he desenterrado de los archivos ni lo he leído yo mismo, es cierto), y tiene que ampliarse con bastante frecuencia para incluir nuevos TLD (una vez para TLD de 4 letras como .info, luego otra vez para TLD de 6 letras como .museum). A menudo escuché a personas bastante informadas afirmar que la validación perfecta del correo electrónico es imposible y, habiendo trabajado anteriormente para un proveedor de servicios de correo electrónico, puedo decirles que era un objetivo en constante movimiento. Pero para los enfoques más simples, consulte la pregunta Validación de correo electrónico TSQL (sin regex ) .

Un dígito numérico

Probablemente el más fácil del grupo:

WHERE @s LIKE '[0-9]';

Números de tarjetas de crédito

Suponiendo que elimine guiones y espacios, lo que debería hacer en cualquier caso. Tenga en cuenta que esto no es una verificación real del algoritmo del número de tarjeta de crédito para garantizar que el número en sí sea realmente válido, solo que se ajusta al formato general (AmEx =15 dígitos que comienzan con 3, el resto son 16 dígitos - Visa comienza con un 4, MasterCard comienza con un 5, Discover comienza con un 6 y creo que hay uno que comienza con un 7 (aunque pueden ser tarjetas de regalo de algún tipo):

WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

Si quieres ser un poco más preciso a costa de ser prolijo, puedes decir:

WHERE (LEN(@s) = 15 AND @s LIKE '3'     + REPLICATE('[0-9]', 14))
   OR (LEN(@s) = 16 AND @s LIKE '[4-7]' + REPLICATE('[0-9]', 15));

Números de teléfono de EE. UU.

Nuevamente, asumiendo que primero va a quitar paréntesis, guiones y espacios. Bastante seguro de que un código de área de EE. UU. no puede comenzar con un 1; si hay otras reglas, no las conozco.

WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

No voy a ir más lejos, porque muchas de las otras expresiones que ha definido se pueden extrapolar de las anteriores. Esperemos que esto le da un comienzo. Debería poder buscar en Google algunos de los otros para ver cómo otras personas han replicado los patrones con T-SQL. Algunos de ellos (como los días de la semana) probablemente solo se pueden comparar con una tabla; parece excesivo hacer una coincidencia de patrón invasie para un conjunto de 7 valores posibles. De manera similar, con una lista de 1000 números o años, estas son cosas que serán mucho más fáciles (y probablemente más eficientes) para verificar si el valor numérico está en una tabla en lugar de convertirlo en una cadena y ver si coincide con algún patrón.

Reitero que gran parte de esto será mucho mejor si puede limpiar y validar los datos antes de que entren en la base de datos en primer lugar. Debe esforzarse por hacer esto siempre que sea posible, porque sin CLR, simplemente no puede hacer RegEx potente dentro de SQL Server.