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ć?
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ć.
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');
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 .
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;
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