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?
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.
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.
Étant donné mes exemples, l’option la plus sûre serait peut-être:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
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 .
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;