Substituição de string do MySQL

560

Eu tenho uma coluna contendo URLs (ID, URL):

http://www.example.com/articles/updates/43
http://www.example.com/articles/updates/866
http://www.example.com/articles/updates/323
http://www.example.com/articles/updates/seo-url
http://www.example.com/articles/updates/4?something=test

Gostaria de mudar a palavra "atualizações" para "notícias". É possível fazer isso com um script?

n00b
fonte
2
Possível duplicata do MySql - Maneira de atualizar parte de uma string?
Steve Chambers

Respostas:

1285
UPDATE your_table
SET your_field = REPLACE(your_field, 'articles/updates/', 'articles/news/')
WHERE your_field LIKE '%articles/updates/%'

Agora linhas que eram como

http://www.example.com/articles/updates/43

será

http://www.example.com/articles/news/43

http://www.electrictoolbox.com/mysql-find-replace-text/

Giraldi
fonte
23
Pergunta rápida, é realmente necessário ter a cláusula "WHERE"?
19413 John Crawford
55
@JohnCrawford De acordo com o artigo no link: "Você não precisa necessariamente adicionar a WHERE LIKEcláusula no final, porque se o texto a ser encontrado não estiver lá, a linha não será atualizada, mas deverá acelerar as coisas . "
Giraldi
3
A cláusula WHERE fornece controle específico sobre o que é substituído. Sem uma, todas as linhas serão verificadas e os dados potencialmente substituídos se uma correspondência for encontrada.
Carlton
11
Eu acredito que neste caso o ONDE é inútil porque um LIKE '%%'não usa nenhum índice, se houvesse outras partes em que, quando, por exemplo, algo como date_added > '2014-07-01'isso poderia ter ajudado
Fabrizio
13
Eu sempre vir aqui para referência quando preciso substituir algo no mysql
Daniel Pecher
141

Sim, o MySQL tem uma função REPLACE ():

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
    -> 'WwWwWw.mysql.com'

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

Observe que é mais fácil se você criar um alias ao usar SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....
onteria_
fonte
Desde que o OP updatesapareça apenas uma vez na string, isso funcionaria. Caso contrário, você estará preso à manipulação direta de strings, o que é uma verdadeira dor no MySQL. Nesse ponto, seria mais fácil escrever um script único para selecionar os campos, manipulação no cliente e depois escrever de volta.
Marc B
20

A função de substituição deve funcionar para você.

REPLACE(str,from_str,to_str)

Retorna a string str com todas as ocorrências da string from_str substituídas pela string to_str. REPLACE()realiza uma correspondência que diferencia maiúsculas de minúsculas ao procurar from_str.

Jay
fonte
9

Você pode simplesmente usar a função replace (),

com cláusula where

update tabelName set columnName=REPLACE(columnName,'from','to') where condition;

sem onde cláusula

update tabelName set columnName=REPLACE(columnName,'from','to');

Nota: A consulta acima, se for para atualizar registros diretamente na tabela, se você deseja selecionar a consulta e os dados não devem ser afetados na tabela, pode usar a seguinte consulta-

select REPLACE(columnName,'from','to') as updateRecord;
Deepak Kumbhar
fonte
6

Além da resposta de gmaggio, se você precisar dinamicamente REPLACEe de UPDATEacordo com outra coluna, você pode fazer, por exemplo:

UPDATE your_table t1
INNER JOIN other_table t2
ON t1.field_id = t2.field_id
SET t1.your_field = IF(LOCATE('articles/updates/', t1.your_field) > 0, 
REPLACE(t1.your_field, 'articles/updates/', t2.new_folder), t1.your_field) 
WHERE...

No meu exemplo, a string articles/news/é armazenada other_table t2e não é necessário usar LIKEa WHEREcláusula

RafaSashi
fonte