¿Cómo validar una consulta SQL con expresión regular?

En general, una fila de datos consistirá en una dirección de correo electrónico, números de teléfono, valores alfanuméricos/alfanuméricos, etc. Por lo general, las validaciones frontales están ahí para validar una dirección de correo electrónico/número de teléfono, etc. En este artículo, lo haremos vea cómo se puede validar usando expresiones regulares mientras escribe consultas SQL. Porque siempre es bueno pasar datos relevantes en el backend. Siempre que hay un error en los datos, la expresión regular lo valida rápidamente e informa al usuario si se trata de un éxito o de un fracaso.

Paso 1: Crear una base de datos

Consulta:

SELECT * FROM sys.databases WHERE name = 'GEEKSFORGEEKS'
    BEGIN
    CREATE DATABASE [GEEKSFORGEEKS]
    END

Paso 2: Cree la tabla «GeekAuthors» en la base de datos «GEEKSFORGEEKS»

Consulta:

use GEEKSFORGEEKS
CREATE TABLE GeekAuthors (
    ID INT IDENTITY NOT NULL PRIMARY KEY,
    AuthorName VARCHAR(255) NOT NULL,
    AuthorEmail VARCHAR(255) NOT NULL,
    Age INT,
    Skillsets VARCHAR(255),
    NumberOfPosts INT
);
GO

Como AuthorEmail es una columna varchar, se ingresó una dirección de correo electrónico incorrectamente no válida en la tabla «GeekAuthors». Nuestra tarea es encontrar las filas que obtuvieron una dirección de correo electrónico no válida.

Paso 3: para lograr esto, pongamos datos de muestra en cada fila

INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Rachel','rachel@gmail.com',25,'Java,Python,.Net',5);
INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Phoebe','phoebegmailcom',22,'Android,Python,.Net',15);
INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Monica','monica@gmailcom',23,'IOS,GO,R',10);
INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Joey','joey@.com',24,'Java,Python,GO',5);
INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Chandler','chandler@gmail',23,'IOS,GO,R',10);
INSERT INTO GeekAuthors (AuthorName,AuthorEmail,Age,Skillsets,NumberOfPosts) 
VALUES ('Ross','ross@gmail.com',24,'Java,Python,GO',5);

Paso 4: Ahora validamos la dirección de correo electrónico.

Necesitamos validar si la dirección de correo electrónico ingresada es correcta o no. Para eso, podemos lograrlo fácilmente.

Consulta:

-- Get all email address
SELECT AuthorEmail FROM GeekAuthors
-- Get ValidEmail Address
SELECT AuthorEmail AS ValidEmail
FROM GeekAuthors
WHERE AuthorEmail LIKE '%_@__%.__%'
        AND PATINDEX('%[^a-z,0-9,@,.,_,\-]%', AuthorEmail) = 0
GO
-- use NOT condition in the WHERE clause and select all the invalid emails as well.
SELECT AuthorEmail AS NotValidEmail
FROM GeekAuthors
WHERE NOT AuthorEmail LIKE '%_@__%.__%'
        AND PATINDEX('%[^a-z,0-9,@,.,_,\-]%', AuthorEmail) = 0
GO

Producción:

 

Paso 5: para ubicar el valor numérico del valor dado usando la expresión regular. Se puede averiguar usando dos formas.

Nuestra expresión de entrada puede consistir en valores alfanuméricos. Para averiguar la posición del valor numérico en los datos, podemos usar el siguiente formato.

Consulta:

--pattern to check is: Not of  A-Z (both A-Z and a-z(search pattern))
-- in the input string and 
--finding the position of the non-matching pattern
-- As we are checking numeric values, it checks for numeric value position 
--and it is displaying position of the character
Way 1 :
SELECT 'GeekPremierLeague2022' as ContestName,
PATINDEX('%[^A-Za-z]%', 'GeekPremierLeague2022') as
NumericCharacterPosition;
Way 2 :
SELECT 'GeekPremierLeague2022' as ContestName, 
PATINDEX('%[0-9]%', 'GeekPremierLeague2022') as
NumericCharacterPosition;

Producción:

En caso de que el valor numérico no esté disponible, obtendremos 0 como respuesta

Producción:

Paso 6: en algunos escenarios, es posible que necesitemos extraer solo letras (az) de la string de entrada. 

Puede ser posible combinando 2 funciones, a saber, PATINDEX y STUFF. 

  • Se debe aplicar una expresión regular en PATINDEX. Usando la consulta anterior obtendremos la posición numérica
  • Usando la función STUFF, podemos reemplazar todos los valores numéricos.

Consulta:

-- At the 18th position, one character is replaced. 
We need to remove numeric value. 
-- Hence STUFF function is used
1st Param -- Input string
 2nd Param -- Start location . As numeric is present
  at 18th location, here it is given
 3rd Param -- Number of characters to be replaced 
 4th Param - Replacing value
SELECT STUFF('GeekPremierLeague2022', 18, 1, '' ); 
-- One character is replaced at the index 18
-- If we want to remove all the numeric above
SELECT STUFF('GeekPremierLeague2022', 18, 4, '' ); 
-- Four characters are replaced starting from  the index 18

Producción:

Por lo tanto, al aplicar PATINDEX y STUFF, podemos eliminar el valor numérico en la string dada:

Consulta:

-- Below code will produce only alpha text only
-- Scenario: A column is created in a table to accept
   only alphabets. As there is no direct way available, 
-- we can use this approach and extract the alphabets alone
DECLARE @inputData NVARCHAR(MAX) = 'GEEKS PREMIER LEAGUE 2022'       
--input string
DECLARE @intPosition INT    
 --get the position of the integer from the input string   
SET @intPosition = PATINDEX('%[^A-Za-z]%', @inputData) 
-- We can use PATINDEX('%[0-9]%') also
print @intPosition
--run loop until no integer is found in the input string
WHILE @intPosition > 0                                     
  BEGIN  
     --remove the integer from that position
    SET @inputData = STUFF(@inputData, @intPosition, 1, '' )   
    --PRINT @inputData 
    SET @intPosition = PATINDEX('%[^A-Za-z]%', @inputData )
    --Again get the position of the next integer in the input string
    --PRINT @intPosition 
END  
SELECT 'GEEKS PREMIER LEAGUE 2022' as InputString, @inputData AS AlphabetsOnly

Producción:

Paso 7: para obtener solo los valores numéricos, suponga que cuando se produce la fuente de datos que consiste en el nombre del empleado, el número de teléfono, la dirección y la identificación del correo electrónico, podemos usar el siguiente enfoque para recuperar el número de teléfono (es decir, valor numérico) en la siguiente camino. 

Consulta:

DECLARE @inputString  VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)

SET @inputString  = 'GeekAuthor1 123456789 Address1 geek@gmail.com'
--We are going to take continuous set of numbers
 and it should not have any spaces also in between
SET @validchars = '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@inputString )
IF @idx > 0 AND 
    (@idx = LEN(@inputString )-8
    OR PATINDEX(SUBSTRING(@inputString ,@idx+9,1),'[0-9]')=0)
    SET @inputString =SUBSTRING(@inputString,
    PATINDEX('%'+ @validchars +'%',@inputString ), 9)
ELSE SET @inputString  = ''
SELECT @inputString as NumericAlone

Por lo tanto, las expresiones regulares se utilizan en muchos lugares para validar un correo electrónico, una dirección, validar alfa solo o validar numérico solo.

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *