Execute regex (substituir) em uma consulta SQL
-
02-07-2019 - |
Pergunta
O que é a melhor maneira de substituir todos '& lt' com <
em uma determinada coluna de banco de dados? Basicamente realizar s/<[^;]/</gi
Notas:
- O trabalho deve em MS SQL Server de 2000
- Deve ser repetitivo (e não acabar com
<;;;;;;;;;
)
Solução
Alguns hacking necessário, mas podemos fazer isso com COMO , PATINDEX , esquerdo e DIREITO e bom e velho concatenação.
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
Melhor é que este é o SQL Server versão agnóstico e deve funcionar muito bem.
Outras dicas
Eu acho que isso pode ser feito muito mais limpo se você usar coisas diferentes:)
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
Como sobre: ??
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
Editar:
Eu só percebi isso irá ignorar colunas com cordas <
parcialmente corretas.
Nesse caso, você pode ignorar a segunda parte da cláusula onde e chamar isso depois:
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
Este artigo aborda como criar um simples Regex substituir função que você pode usar no SQL 2000 (e 2005 com um simples puxão) que pode ajudá-lo.
Se suportes sabor de regex de MSSQL lookahead negativo, que seria a maneira correta de abordar isso.
s/<(?!;)/</gi
vai pegar todas as instâncias de & lt que não são seguidos por um ; (mesmo se eles são seguidos por nada, o que [^;] perderia) e não capturar o seguinte não ;. caráter como parte do jogo, eliminando o problema mencionado nos comentários sobre a pergunta original de que o personagem sendo perdida na substituição
Infelizmente, eu não uso MSSQL, então eu não tenho idéia se ele suporta lookahead negativo ou não ...
Muito específico para esse padrão, mas tenho feito semelhante a este no passado:
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
exemplo mais amplo (caracteres codificam o qual pode ser inadequado em um atributo TÍTULO)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')