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 instances de cat
avec dog
, par exemple.
Quelle est la meilleure façon de procéder?
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 instances de cat
avec dog
, par exemple.
Quelle est la meilleure façon de procéder?
Réponses:
Vous souhaitez utiliser la fonction de remplacement de postgresql :
replace(string text, from text, to text)
par exemple :
UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')
Soyez conscient, cependant, que ce sera un remplacement de chaîne à chaîne, donc «catégorie» deviendra «dogegory». la fonction regexp_replace peut vous aider à définir un modèle de correspondance plus strict pour ce que vous souhaitez remplacer.
regexp_replace
Si vous avez besoin d'une correspondance de remplacement plus stricte, la regexp_replace
fonction de PostgreSQL peut correspondre en utilisant des modèles d'expression régulière POSIX. Il a la syntaxe regexp_replace (source, modèle, remplacement [, drapeaux]) .
J'utiliserai respectivement des drapeaux i
et g
pour la correspondance insensible à la casse et globale. 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 problèmes lors du remplacement de regex. Voyons à quel point 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 "dog" en minuscules, ce qui casse la mise en majuscule des phrases.
Consultez les documents de correspondance de modèles PostgreSQL actuels pour tous les détails.
Compte tenu de 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 replace
fonction
UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')
La définition de la fonction est la suivante (obtenue à partir d' ici ):
replace(string text, from text, to text)
et renvoie le texte modifié. Vous pouvez également consulter ce violon sql .
Voici un exemple qui remplace toutes les instances de 1 ou plusieurs espaces blancs 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;