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


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.


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

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 .


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;

Une seule barre oblique inverse avant le "s" est nécessaire, je pense
Marty Neal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.