regulares - Realice regex(replace) en una consulta SQL
replace con expresiones regulares sql server (5)
Creo que esto se puede hacer mucho más limpio si usas diferente STUFF :)
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values (''< <- ok, < <- nok'')
WHILE 1 = 1
BEGIN
UPDATE test SET
val = STUFF( val , PATINDEX(''%<[^;]%'', val) + 3 , 0 , '';'' )
FROM test
WHERE val LIKE ''%<[^;]%''
IF @@ROWCOUNT = 0 BREAK
END
select * from test
¿Cuál es la mejor manera de reemplazar todo ''& lt'' con <
en una columna de base de datos dada? Básicamente realizar s/<[^;]/</gi
Notas:
- debe funcionar en MS SQL Server 2000
- Debe ser repetible (y no terminar con
<;;;;;;;;;
)
Hace falta algo de hacking, pero podemos hacerlo con LIKE , PATINDEX , LEFT AND RIGHT y una buena concatenación de cadenas antiguas.
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values (''< <- ok, < <- nok'')
while 1 = 1
begin
update test
set val = left(val, patindex(''%<[^;]%'', val) - 1) +
''<'' +
right(val, len(val) - patindex(''%<[^;]%'', val) - 2)
from test
where val like ''%<[^;]%''
IF @@ROWCOUNT = 0 BREAK
end
select * from test
Mejor es que esta es una versión de SQL Server independiente y debería funcionar bien.
Qué tal si:
UPDATE tableName
SET columName = REPLACE(columName , ''<'', ''<'')
WHERE columnName LIKE ''%lt%''
AND columnName NOT LIKE ''%lt;%''
Editar:
Me acabo de dar cuenta de que esto ignorará las columnas con parcialmente correcto <
instrumentos de cuerda.
En ese caso, puede ignorar la segunda parte de la cláusula where y llamar a esto después:
UPDATE tableName
SET columName = REPLACE(columName , ''<;'', ''<'')
Si el sabor de la expresión regular de MSSQL admite un look-a-look negativo, esa sería la forma correcta de abordar esto.
s/<(?!;)/</gi
capturará todas las instancias de & lt que no sean seguidas por a ; (incluso si no van seguidos de nada, lo que [^;] se perderá) y no captura lo siguiente no ; personaje como parte del partido, eliminando el problema mencionado en los comentarios sobre la pregunta original de que ese personaje se perdió en el reemplazo.
Lamentablemente, no uso MSSQL, así que no tengo idea de si admite negativos o no ...
Este artículo cubre cómo crear una función Regex Replace simple que puede usar en SQL 2000 (y 2005 con ajustes simples) que puede ayudarlo.