No postgresql, como substituo todas as instâncias de uma string em uma coluna do banco de dados?
Digamos que eu queira substituir todas as instâncias de cat
por dog
, por exemplo.
Qual é a melhor forma de fazer isso?
No postgresql, como substituo todas as instâncias de uma string em uma coluna do banco de dados?
Digamos que eu queira substituir todas as instâncias de cat
por dog
, por exemplo.
Qual é a melhor forma de fazer isso?
Respostas:
Você deseja usar a função de substituição do postgresql :
replace(string text, from text, to text)
por exemplo :
UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')
Esteja ciente, no entanto, de que isso será uma substituição string a string, para que 'categoria' se torne 'dogegory'. a função regexp_replace pode ajudar a definir um padrão de correspondência mais rigoroso para o que você deseja substituir.
regexp_replace
Se você precisar de uma correspondência de substituição mais rígida, a regexp_replace
função do PostgreSQL poderá corresponder usando padrões de expressão regular POSIX. Possui a sintaxe regexp_replace (origem, padrão, substituição [, sinalizadores]) .
Usarei sinalizadores i
e g
para correspondência global e sem distinção entre maiúsculas e minúsculas, respectivamente. Eu também vou usar \m
e\M
para coincidir com o início e o fim de uma palavra, respectivamente.
Geralmente, existem algumas dicas ao executar a substituição de regex. Vamos ver como é fácil substituir um gato por um cachorro .
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
Mesmo depois de tudo isso, há pelo menos uma condição não resolvida. Por exemplo, as frases que começam com "Gato" serão substituídas por "cachorro" em minúsculas que quebram a capitalização de frase.
Confira os documentos atuais de correspondência de padrões do PostgreSQL para obter todos os detalhes.
Dados meus exemplos, talvez a opção mais segura seria:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Você pode usar a replace
função
UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')
A definição da função é a seguinte (obtida daqui ):
replace(string text, from text, to text)
e retorna o texto modificado. Você também pode verificar este violino sql .
Aqui está um exemplo que substitui todas as instâncias de 1 ou mais caracteres de espaço em branco em uma coluna por um sublinhado usando expressão regular -
select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;