postgresql-Zastąp wszystkie wystąpienia ciągu znaków w polu tekstowym

W postgresql, jak zastąpić wszystkie instancje ciągu znaków w kolumnie bazy danych?

Powiedzmy, że chcę zastąpić wszystkie instancje cat na dog, na przykład.

Jaki jest najlepszy sposób, aby to zrobić?

Author: Eric Leschinski, 2011-02-21

4 answers

Chcesz użyć funkcji postgresql replace :

replace(string text, from text, to text)

Na przykład:

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

Należy jednak pamiętać, że będzie to wymiana ciągów na ciągi, więc 'kategoria' stanie się'dogegory'. funkcja regexp_replace może pomóc w zdefiniowaniu bardziej rygorystycznego wzorca dopasowania dla tego, co chcesz zastąpić.

 319
Author: Jerome WAGNER,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 09:57:45

Sposób Wyrażenia Regularnego

Jeśli potrzebujesz dokładniejszego dopasowania zastępczego, funkcja PostgreSQL regexp_replace może dopasować się przy użyciu wzorców wyrażeń regularnych POSIX. Ma składnię regexp_replace(source, pattern, replacement [, flags ]).

Użyję znaczników i i g odpowiednio do dopasowania wielkości liter i dopasowania globalnego. Użyję również \m i \M, aby dopasować odpowiednio początek i koniec słowa.

Są zazwyczaj całkiem kilka gotchas podczas wykonywania wymiany regex. Zobaczmy, jak łatwo jest zastąpić kota psem .

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

Nawet po tym wszystkim, jest przynajmniej jeden nierozwiązany warunek. Na przykład zdania zaczynające się od "Cat" zostaną zastąpione małymi literami "dog", które przełamują kapitalizację zdań.

Sprawdź aktualną dokumentację PostgreSQL pattern matching, aby poznać wszystkie szczegóły.

Zaktualizuj całą kolumnę za pomocą wymiany tekst

Biorąc pod uwagę moje przykłady, może najbezpieczniejszą opcją byłoby:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
 65
Author: Clint Pachl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 09:44:36

Możesz użyć funkcji replace

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

Definicja funkcji jest następująca (pochodzi z tutaj):

replace(string text, from text, to text)

I zwraca zmodyfikowany tekst. Możesz również sprawdzić Ten SQL fiddle .

 25
Author: Ciprian Mocanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 10:10:40

Oto przykład, który zastępuje wszystkie wystąpienia 1 lub więcej znaków spacji w kolumnie podkreśleniem za pomocą wyrażenia regularnego -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;
 0
Author: user1797212,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 19:12:40