postgresql - reemplaza todas las instancias de una cadena dentro del campo de texto

Respuestas:

404

Desea utilizar la función de reemplazo de postgresql :

replace(string text, from text, to text)

por ejemplo :

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

Sin embargo, tenga en cuenta que esto será un reemplazo de cadena a cadena, por lo que 'categoría' se convertirá en 'dogegory'. la función regexp_replace puede ayudarlo a definir un patrón de coincidencia más estricto para lo que desea reemplazar.

Jerome WAGNER
fuente
44
Hola chicos, me gusta su respuesta y explicación, es realmente útil. ¿Podría agregar un ejemplo utilizando regexp_replace? ¡Gracias!
Wim Feijen
1
para una mejor granularidad, puede usarregexp_replace
drs
83

La forma de expresión regular

Si necesita una coincidencia de reemplazo más estricta, la regexp_replacefunción de PostgreSQL puede coincidir utilizando patrones de expresión regular POSIX. Tiene la sintaxis regexp_replace (fuente, patrón, reemplazo [, banderas]) .

Usaré banderas iy gpara mayúsculas y minúsculas, respectivamente. También usaré \my \Mpara hacer coincidir el principio y el final de una palabra, respectivamente.

Por lo general, hay bastantes problemas al realizar el reemplazo de expresiones regulares. Veamos qué fácil es reemplazar un gato con un perro .

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

Incluso después de todo eso, hay al menos una condición no resuelta. Por ejemplo, las oraciones que comienzan con "Cat" serán reemplazadas por "dog" en minúsculas que rompen las mayúsculas de las oraciones.

Consulte los documentos actuales de coincidencia de patrones de PostgreSQL para obtener todos los detalles.

Actualizar columna completa con texto de reemplazo

Dados mis ejemplos, tal vez la opción más segura sería:

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

Puedes usar la replacefunción

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

La definición de la función es la siguiente (obtenida de aquí ):

replace(string text, from text, to text)

y devuelve el texto modificado. También puede consultar este violín sql .

Ciprian Mocanu
fuente
0

Aquí hay un ejemplo que reemplaza todas las instancias de 1 o más caracteres de espacio en blanco en una columna con un guión bajo utilizando expresiones regulares:

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;
usuario1797212
fuente
Creo que solo se necesita una barra invertida antes de la "s"
Marty Neal