postgresql - substitui todas as instâncias de uma string no campo de texto

213

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 catpor dog, por exemplo.

Qual é a melhor forma de fazer isso?

marca
fonte
7
Se a pesquisa falhar, tente o manual: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

Respostas:

404

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.

Jerome WAGNER
fonte
4
Oi pessoal, eu gosto da sua resposta e explicação, é realmente útil. Você poderia adicionar um exemplo usando regexp_replace? Obrigado!
Wim Feijen 22/10
1
para melhor granularidade, você pode usarregexp_replace
drs
83

O caminho da expressão regular

Se você precisar de uma correspondência de substituição mais rígida, a regexp_replacefunçã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 ie gpara correspondência global e sem distinção entre maiúsculas e minúsculas, respectivamente. Eu também vou usar \me\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.

Atualizar coluna inteira com texto de substituição

Dados meus exemplos, talvez a opção mais segura seria:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Clint Pachl
fonte
30

Você pode usar a replacefunçã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 .

Ciprian Mocanu
fonte
0

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;
user1797212
fonte
Apenas uma barra invertida antes do "s" é necessária, eu acho
Marty Neal