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


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.


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');

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 .


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;

Apenas uma barra invertida antes do "s" é necessária, eu acho
Marty Neal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.