2009-11-04 14 views
38

Próbuję zastąpić kilka znaków w polu MySQL. Znam funkcję REPLACE, ale która zastępuje tylko jeden ciąg na raz. Nie widzę żadnych odpowiednich funkcji in the manual.Czy MySQL może zastąpić wiele znaków?

Czy mogę zastąpić lub usunąć wiele ciągów naraz? Na przykład muszę zastąpić spacje myślnikami i usunąć inne znaki interpunkcyjne.

Odpowiedz

50

Można łańcucha REPLACE funkcje:

select replace(replace('hello world','world','earth'),'hello','hi') 

To będzie drukować hi earth.

Można nawet użyć podkwerendy do zastąpienia wielu ciągów!

select replace(london_english,'hello','hi') as warwickshire_english 
from (
    select replace('hello world','world','earth') as london_english 
) sub 

lub użyć JOIN je wymienić:

select group_concat(newword separator ' ') 
from (
    select 'hello' as oldword 
    union all 
    select 'world' 
) orig 
inner join (
    select 'hello' as oldword, 'hi' as newword 
    union all 
    select 'world', 'earth' 
) trans on orig.oldword = trans.oldword 

Zostawię tłumaczenie za pomocą typowych wyrażeń tabeli jako ćwiczenie dla czytelnika;)

+1

co !? nie, nie będzie :) – Zak

+0

@Zak: eh ... prawda, rzeczywiście czytasz zapytanie? Zmienię to;) – Andomar

+1

Niestety, chciałbym wprowadzić pytanie, w którym używałem zagnieżdżonych REPLACE. Miałem nadzieję na coś podobnego do funkcji PHP "str_replace", ale myślę, że to nie istnieje. – DisgruntledGoat

0

Proponuję uruchomiony program do zapętlić swoje rekordy, przetworzyć pola, a następnie je zaktualizować. Może prosty skrypt perlowy lub php.

+6

Uważam, że PO szuka rozwiązania SQL. –

5

Kaskadowanie jest jedynym prostym i prostym rozwiązaniem dla mySQL do wielokrotnego zastępowania znaków.

UPDATE table1 
SET column1 = replace(replace(REPLACE(column1, '\r\n', ''), '<br />',''), '<\r>','') 
+0

Jak zaobserwowano w innej odpowiedzi, ** to może nie działać **. Zamiast łańcucha A z C na przykład C zastąpi A z C, *, a następnie zamieni C na E *, aby "HAL" nie stało się "HCL", ale "HEL". – LSerni

1

REPLACE robi dobrą proste zadanie zastąpienia znaków lub frazy wszędzie pojawiają się one w ciąg. Ale przy czyszczeniu interpunkcji możesz potrzebować szukać wzorców - np. ciąg białych znaków lub znaków w poszczególnych częściach tekstu, np. w środku słowa lub po pełnym zatrzymaniu. Jeśli tak jest, funkcja zamiany wyrażenia regularnego byłaby znacznie silniejsza. Złe wiadomości to MySQL doesn't provide such a thing, ale dobrą wiadomością jest to, że można zapewnić obejście problemu - patrz this blog post.

Czy mogę zastąpić lub usunąć wiele ciągów naraz? Na przykład potrzebuję , aby zastąpić spacje kreskami i usunąć inną interpunkcję.

Powyższe można uzyskać za pomocą kombinacji zamiennika wyrażenia regularnego i standardowej funkcji REPLACE. Można to zobaczyć w akcji w this online Rextester demo.

SQL (z wyjątkiem kodu funkcji dla zwięzłość):

SELECT txt, 
     reg_replace(REPLACE(txt, ' ', '-'), 
        '[^a-zA-Z0-9-]+', 
        '', 
        TRUE, 
        0, 
        0 
        ) AS `reg_replaced` 
FROM test; 
1

Używam lib_mysqludf_preg dla tego, który pozwala na: wyrażeń regularnych

Zastosowanie PCRE bezpośrednio w MySQL

Dzięki temu Biblioteka zainstalowany mógłby zrobić coś takiego:

SELECT preg_replace('/(\\.|com|www)/','','www.example.com'); 

co dałoby ci:

example 
Powiązane problemy