Jak mogę użyć mySQL replace () do zamiany ciągów w wielu rekordach?


166

Mamy bazę danych, która ma kilka rekordów z pewnymi złymi danymi w jednej kolumnie, w której osadzony edytor uciekł przed niektórymi rzeczami, których nie powinien był uciec i zrywa wygenerowane linki.

Chcę uruchomić zapytanie, aby zamienić złe znaki we wszystkich rekordach, ale nie mogę dowiedzieć się, jak to zrobić. Znalazłem replace()funkcję w MySQL, ale jak mogę jej użyć w zapytaniu?

Na przykład, jaka byłaby poprawna składnia, gdybym chciał zastąpić ciąg &lt;rzeczywistym nawiasem trójkątnym mniejszym niż kątowy ( <) we wszystkich rekordach znajdujących się &lt;w articleItemkolumnie? Czy można to zrobić za pomocą jednego zapytania (tj. Wybrać i zamienić wszystko za jednym zamachem), czy też muszę wykonywać wiele zapytań? Nawet jeśli jest to wiele zapytań, w jaki sposób mogę użyć replace()do zastąpienia wartości pola w więcej niż jednym rekordzie?


5
zanim cokolwiek zrobisz, upewnij się, że wykonałeś również kopię zapasową bazy danych. Możesz również użyć aktualizacji do zaktualizowania dowolnego pola.
Matt,


Odpowiedzi:


395

Na bardzo ogólnym poziomie

UPDATE MyTable

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

WHERE SomeOtherColumn LIKE '%PATTERN%'

W twoim przypadku mówisz, że uciekli, ale ponieważ nie określasz, w jaki sposób uciekli, powiedzmy, że uciekli do GREATERTHAN

UPDATE MyTable

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

WHERE articleItem LIKE '%GREATERTHAN%'

Ponieważ twoje zapytanie faktycznie będzie działało wewnątrz łańcucha, WHEREjest mało prawdopodobne, aby twoja klauzula dopasowująca wzorzec poprawiła jakąkolwiek wydajność - w rzeczywistości wygeneruje więcej pracy dla serwera. Jeśli nie masz innego członka klauzuli WHERE, który sprawi, że to zapytanie będzie działało lepiej, możesz po prostu wykonać aktualizację w następujący sposób:

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

Możesz także zagnieżdżać wiele REPLACEpołączeń

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

Możesz to również zrobić po wybraniu danych (a nie podczas ich zapisywania).

Więc zamiast:

SELECT MyURLString From MyTable

Mógłbyś

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


7
drobny spór: GREATERTHAN to „>”
Olivier Dulac

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

Naprawiono &lt;s. Musisz użyć kodowania &, tak jak to: &amp;:)
Dan J

Ponownie to zredagowałem. Dzięki, że dałeś mi znać. Dotarło do mnie chwilę po tym, jak powiedziałem, że nie wiem jak. Tak właśnie działa mój świat. :)
simshaun

6

Sprawdź to

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

Np. Z przykładowym ciągiem znaków:

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

EG z nazwą kolumny / pola:

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

4

możesz napisać taką procedurę składowaną:

UTWÓRZ PROCEDURĘ sanitize_ TABLE ()

ZACZYNAĆ

# Zastąp spację podkreśleniem

UPDATE Table SET FieldName = REPLACE ( FieldName , "", "_") WHERE FieldName nie ma wartości NULL;

# usuń kropkę

UPDATE Table SET FieldName = REPLACE ( FieldName , ".", "") WHERE FieldName nie ma wartości NULL;

#usunąć (

UPDATE Table SET FieldName = REPLACE ( FieldName , "(", "") WHERE FieldName nie ma wartości NULL;

#usunąć )

UPDATE Table SET FieldName = REPLACE ( FieldName , ")", "") WHERE FieldName nie ma wartości NULL;

#raplace lub usuń dowolny znak

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

KONIEC

W ten sposób masz modułową kontrolę nad stołem.

Możesz również uogólnić procedurę składowaną, czyniąc ją parametryczną z parametrem wejściowym table do sanitoze


1
te zerowe czeki są zbędne
kiedysktos

Czy są jakieś łatwe i bezpieczne narzędzia do tworzenia procedury składowanej mysql?
Ivan Slaughter

0

To ci pomoże.

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

Wynik:

title = Elmer's Parade
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.