postgresql - remplace toutes les instances d'une chaîne dans le champ de texte

213

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 catavec dog, par exemple.

Quelle est la meilleure façon de procéder?

marque
la source
7
Si la recherche sur Google échoue, essayez le manuel: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

Réponses:

404

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.

Jerome WAGNER
la source
4
Salut les gars, j'aime votre réponse et votre explication, c'est vraiment utile. Pourriez-vous s'il vous plaît ajouter un exemple en utilisant regexp_replace? Merci!
Wim Feijen
1
pour une meilleure granularité, vous pouvez utiliserregexp_replace
drs
83

La voie de l'expression régulière

Si vous avez besoin d'une correspondance de remplacement plus stricte, la regexp_replacefonction 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 iet gpour la correspondance insensible à la casse et globale. J'utiliserai également \met \Mpour 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.

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

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');
Clint Pachl
la source
30

Vous pouvez utiliser la replacefonction

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 .

Ciprian Mocanu
la source
0

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;
user1797212
la source
Une seule barre oblique inverse avant le "s" est nécessaire, je pense
Marty Neal