Como posso usar o mySQL replace () para substituir strings em vários registros?


166

Temos um banco de dados que possui vários registros com alguns dados inválidos em uma coluna, nos quais um editor incorporado escapou de coisas que não deveriam ter escapado e está quebrando links gerados.

Quero executar uma consulta para substituir os caracteres incorretos em todos os registros, mas não consigo descobrir como fazê-lo. Eu encontrei a replace()função no MySQL, mas como posso usá-la dentro de uma consulta?

Por exemplo, qual seria a sintaxe correta se eu quisesse substituir a string &lt;por um colchete de ângulo menor que o real ( <) em todos os registros que possuem &lt;a articleItemcoluna? Isso pode ser feito em uma única consulta (ou seja, selecionar e substituir tudo de uma só vez), ou eu tenho que fazer várias consultas? Mesmo se houver várias consultas, como faço replace()para substituir o valor de um campo em mais de um registro?


5
Antes de fazer qualquer coisa, faça backup do banco de dados também. Você também usaria update para atualizar qualquer campo.
Matt


Respostas:


395

Em um nível muito genérico

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis')

WHERE SomeOtherColumn LIKE '%PATTERN%'

No seu caso, você diz que eles escaparam, mas como você não especifica como eles escaparam, digamos que eles escaparam para GREATERTHAN

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

WHERE articleItem LIKE '%GREATERTHAN%'

Como sua consulta realmente funcionará dentro da cadeia, WHEREé improvável que sua cláusula que faça a correspondência de padrões melhore qualquer desempenho - ela realmente gerará mais trabalho para o servidor. A menos que você tenha outro membro da cláusula WHERE que melhore o desempenho dessa consulta, você pode simplesmente fazer uma atualização como esta:

UPDATE MyTable
SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

Você também pode aninhar várias REPLACEchamadas

UPDATE MyTable
SET StringColumn = REPLACE (REPLACE (StringColumn, 'GREATERTHAN', '>'), 'LESSTHAN', '<')

Você também pode fazer isso quando selecionar os dados (ao contrário de quando salvá-los).

Então, em vez de:

SELECT MyURLString From MyTable

Você poderia fazer

SELECT REPLACE (MyURLString, 'GREATERTHAN', '>') as MyURLString From MyTable


7
menor queixa: GREATERTHAN é '>'
Olivier Dulac

23
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')

Corrigido os &lt;s. Você precisa usar a codificação e, assim: &amp;:)
Dan J

Eu reeditei. Obrigado por me avisar. Me ocorreu momentos depois que eu disse que não sabia como. É assim que meu mundo funciona. :)
simshaun

6

Verifique isto

UPDATE some_table SET some_field = REPLACE("Column Name/String", 'Search String', 'Replace String')

Por exemplo, com string de amostra:

UPDATE some_table SET some_field = REPLACE("this is test string", 'test', 'sample')

EG com nome da coluna / campo:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')

4

você pode escrever um procedimento armazenado como este:

CRIAR PROCEDIMENTO sanitize_ TABLE ()

INÍCIO

# substituir espaço por sublinhado

UPDATE Table SET FieldName = REPLACE ( FieldName , "", "_") ONDE FieldName não é NULL;

#delete ponto

Tabela UPDATE SET FieldName = REPLACE ( FieldName , ".", "") ONDE FieldName não é NULL;

#delete (

ATUALIZAÇÃO da tabela SET FieldName = REPLACE ( FieldName , "(", "")) ONDE FieldName não é NULL;

#delete)

UPDATE Table SET FieldName = REPLACE ( FieldName , ")", "") ONDE FieldName não é NULL;

#raplace ou exclua qualquer caractere desejado

# ..........................

FIM

Dessa forma, você tem controle modularizado sobre a tabela.

Você também pode generalizar o procedimento armazenado, tornando-o paramétrico com a tabela para limpar o parâmetro de entrada


1
esses controlos nulos são redundantes
kiedysktos

Existem ferramentas fáceis e seguras para criar o procedimento armazenado do mysql?
Ivan Slaughter

0

Isso irá ajudá-lo.

UPDATE play_school_data SET title= REPLACE(title, "&#39;", "'") WHERE title = "Elmer&#39;s Parade";

Resultado:

title = Elmer's Parade
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.