Ciąg MySQL zamień

559

Mam kolumnę zawierającą adresy URL (identyfikator, adres 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

Chciałbym zmienić słowo „aktualizacje” na „aktualności”. Czy można to zrobić za pomocą skryptu?

n00b
źródło
2
Możliwy duplikat MySql - Sposób aktualizacji części ciągu?
Steve Chambers

Odpowiedzi:

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

Teraz rzędy, które były

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

będzie

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

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

Giraldi
źródło
23
Szybkie pytanie, czy naprawdę trzeba mieć klauzulę „GDZIE”?
John Crawford,
55
@JohnCrawford Zgodnie z artykułem w linku: „Nie musisz koniecznie dodawać WHERE LIKEklauzuli na końcu, ponieważ jeśli tekstu do znalezienia nie ma, wiersz nie zostanie zaktualizowany, ale powinien przyspieszyć . „
Giraldi
3
Klauzula WHERE daje konkretną kontrolę nad tym, co zostanie zastąpione. Bez jednego każdy wiersz zostanie sprawdzony i potencjalnie dane zostaną zastąpione, jeśli zostanie znalezione dopasowanie.
Carlton,
11
Uważam, że w tym przypadku GDZIE jest bezużyteczne, ponieważ a LIKE '%%'nie korzysta z żadnych indeksów, jeśli byłyby tam inne części GDZIE, na przykład coś takiego date_added > '2014-07-01'mogłoby pomóc
Fabrizio
13
Zawsze przychodzę tu w celach informacyjnych, gdy muszę wymienić coś w mysql
Daniel Pecher
141

Tak, MySQL ma funkcję 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

Pamiętaj, że łatwiej jest zrobić ten alias podczas korzystania SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....
onteria_
źródło
Tak długo, jak OP updatespokazuje się tylko raz w ciągu, to działałoby. W przeciwnym razie utkniesz w bezpośredniej manipulacji ciągami, co jest prawdziwym problemem w MySQL. W tym momencie łatwiej byłoby napisać jednorazowy skrypt, aby wybrać pola, manipulować w kliencie, a następnie odpisać.
Marc B,
20

Funkcja zamiany powinna działać dla Ciebie.

REPLACE(str,from_str,to_str)

Zwraca ciąg znaków ze wszystkimi wystąpieniami ciągu od_str zastąpiony przez ciąg do_str. REPLACE()wykonuje rozróżnianie wielkości liter podczas wyszukiwania from_str.

Sójka
źródło
9

Możesz po prostu użyć funkcji replace (),

z klauzulą ​​gdzie

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

bez klauzuli gdzie

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

Uwaga: powyższe zapytanie, jeśli dla rekordów aktualizacji bezpośrednio w tabeli, jeśli chcesz wybrać zapytanie, a dane nie powinny mieć wpływu na tabelę, możesz użyć następującego zapytania-

select REPLACE(columnName,'from','to') as updateRecord;
Deepak Kumbhar
źródło
6

Oprócz odpowiedzi gmaggio, jeśli potrzebujesz dynamicznie REPLACEi UPDATEwedług innej kolumny możesz na przykład:

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...

W moim przykładzie ciąg articles/news/jest przechowywany w other_table t2i nie ma potrzeby używać LIKEw WHEREklauzuli.

RafaSashi
źródło