web-dev-qa-db-fra.com

postgresql - remplace toutes les occurrences d'une chaîne dans un champ de texte

Dans postgresql, comment remplacer toutes les instances d'une chaîne dans une colonne de base de données?

Disons que je veux remplacer toutes les occurrences de cat par dog, par exemple.

Quelle est la meilleure façon de faire cela?

194
mark

Vous voulez utiliser la fonction remplacer de postgresql:

replace(string text, from text, to text)

par exemple :

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

Sachez cependant qu'il s'agira d'un remplacement de chaîne à chaîne. La "catégorie" deviendra alors "dogegory". La fonction regexp_replace peut vous aider à définir un modèle de correspondance plus strict pour ce que vous souhaitez remplacer.

361
Jerome WAGNER

La voie de l'expression régulière

Si vous avez besoin d'une correspondance de remplacement plus stricte, la fonction regexp_replace de PostgreSQL peut correspondre à l'aide de modèles d'expressions régulières POSIX. Il a la syntaxe regexp_replace (source, motif, remplacement [ flags]) .

Je vais utiliser les indicateurs i et g pour la correspondance insensible à la casse et la correspondance globale, respectivement. J'utiliserai également \m et \M pour faire correspondre le début et la fin d'un mot, respectivement.

Il y a généralement pas mal de pièges à jouer lors du remplacement de regex. Voyons combien il est facile de remplacer un chat par un chien .

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

Même après tout cela, il y a au moins une condition non résolue. Par exemple, les phrases commençant par "Cat" seront remplacées par des "minuscules" "chien" qui interrompent la casse des phrases.

Découvrez la version actuelle de PostgreSQL pattern matching docs pour tous les détails.

Mettre à jour la colonne entière avec le texte de remplacement

Étant donné mes exemples, l’option la plus sûre serait peut-être:

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

Vous pouvez utiliser la fonction replace

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

La définition de la fonction est la suivante (obtenue de here ):

replace(string text, from text, to text)

et retourne le texte modifié. Vous pouvez également vérifier ce violon sql .

28
Ciprian Mocanu

Voici un exemple qui remplace toutes les occurrences d'un ou plusieurs caractères d'espace blanc dans une colonne par un trait de soulignement à l'aide d'une expression régulière -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;
0
user1797212