MySQL dizesi değiştirme


559

URL (id, url) içeren bir sütun var:

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

"Güncellemeler" kelimesini "haberler" olarak değiştirmek istiyorum. Bunu bir senaryo ile yapmak mümkün mü?


Yanıtlar:


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

Şimdi böyle satırlar

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

olacak

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

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


23
Kısa soru, "NEREDE" maddesine sahip olmak gerçekten gerekli mi?
John Crawford

55
@JohnCrawford Bağlantıdaki makaleye göre: " WHERE LIKESonunda yan tümceyi eklemek zorunda değilsiniz , çünkü bulmak için metin orada değilse satır güncellenmez, ancak işleri hızlandırması gerekir . "
Giraldi

3
WHERE cümlesi, nelerin değiştirildiği konusunda size özel kontrol sağlar. Bir satır olmadan her satır kontrol edilir ve bir eşleşme bulunursa potansiyel olarak veriler değiştirilir.
Carlton

11
Bu durumda WHERE'nin işe yaramaz olduğuna inanıyorum, çünkü LIKE '%%'herhangi bir indeks kullanmıyor, eğer WHERE'de başka parçalar varsa, örneğin date_added > '2014-07-01'yardımcı olmuş olabilir gibi bir şey
Fabrizio

13
Ben mysql bir şey değiştirmek gerektiğinde her zaman referans için geldim
Daniel Pecher

141

Evet, MySQL'in bir REPLACE () işlevi vardır:

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

Bunu kullanırken bir takma ad oluşturmanın daha kolay olduğunu unutmayın SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....

OP'ler updatesdizede yalnızca bir kez göründüğü sürece , bu işe yarayacaktır. Aksi takdirde, MySQL'de gerçek bir acı olan doğrudan dize manipülasyonu ile sıkışıp kalırsınız. Bu noktada alanları seçmek için bir kerelik bir komut dosyası yazmak, istemcide manipülasyon yapmak ve daha sonra tekrar yazmak daha kolay olurdu.
Marc B

20

Yerine işlevi sizin için çalışması gerekir.

REPLACE(str,from_str,to_str)

Str dizesinin tüm örneklerini içeren str dizesini ,__tr dizesiyle değiştirir. REPLACE()from_str öğesini ararken büyük / küçük harfe duyarlı bir eşleşme gerçekleştirir.


9

Replace () işlevini kullanabilirsiniz,

nerede fıkra ile-

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

nerede madde olmadan-

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

Not: Güncelleme kayıtları için doğrudan tabloya ilişkin yukarıdaki sorgu, sorguyu seçmek istiyorsanız ve veriler tablodan etkilenmemeli ise aşağıdaki sorguyu kullanabilirsiniz.

select REPLACE(columnName,'from','to') as updateRecord;

6

Dinamik olarak REPLACEve UPDATEbaşka bir sütuna göre ihtiyacınız varsa gmaggio'nun cevabına ek olarak şunları yapabilirsiniz:

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

Benim örnekte dize articles/news/saklanır other_table t2ve kullanmaya gerek yoktur LIKEyılında WHEREmaddesi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.