Saltar al contenido

¿Cómo reemplazar varios caracteres en SQL?

Ten en cuenta que en la informática un problema casi siempere suele tener más de una soluciones, por lo tanto te mostraremos la mejor y más eficiente.

Solución:

Un truco útil en SQL es la habilidad de usar @var = function(...) para asignar un valor. Si tiene varios registros en su conjunto de registros, su var se asigna varias veces con efectos secundarios:

declare @badStrings table (item varchar(50))

INSERT INTO @badStrings(item)
SELECT '>' UNION ALL
SELECT '<' UNION ALL
SELECT '(' UNION ALL
SELECT ')' UNION ALL
SELECT '!' UNION ALL
SELECT '?' UNION ALL
SELECT '@'

declare @testString varchar(100), @newString varchar(100)

set @teststring = 'Juliet ro><0zs my s0x()[email protected][email protected][email protected]!'
set @newString = @testString

SELECT @newString = Replace(@newString, item, '') FROM @badStrings

select @newString -- returns 'Juliet ro0zs my s0xrzone'

Consideraría seriamente hacer un CLR UDF en su lugar y usar expresiones regulares (tanto el string y el patrón se puede pasar como parámetros) para realizar una búsqueda completa y reemplazar un rango de caracteres. Debería superar fácilmente este UDF de SQL.

¡Realmente me gusta la solución de @Juliett! Simplemente usaría un CTE para obtener todos los caracteres no válidos:

DECLARE @badStrings VARCHAR(100)
DECLARE @teststring VARCHAR(100)

SET @badStrings = '><()[email protected]'
SET @teststring = 'Juliet ro><0zs my s0x()[email protected][email protected][email protected]!'

;WITH CTE AS
(
  SELECT SUBSTRING(@badStrings, 1, 1) AS [String], 1 AS [Start], 1 AS [Counter]
  UNION ALL
  SELECT SUBSTRING(@badStrings, [Start] + 1, 1) AS [String], [Start] + 1, [Counter] + 1 
  FROM CTE 
  WHERE [Counter] < LEN(@badStrings)
)

SELECT @teststring = REPLACE(@teststring, CTE.[String], '') FROM CTE

SELECT @teststring

Julieta ro0zs mi s0xrzone

Comentarios y puntuaciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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