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

Resuelto mark asked hace 13 años • 4 respuestas

En postgresql, ¿cómo reemplazo todas las instancias de una cadena dentro de una columna de base de datos?

Digamos que quiero reemplazar todas las instancias de catcon dog, por ejemplo.

¿Cuál es la mejor manera de hacer esto?

mark avatar Feb 21 '11 05:02 mark
Aceptado

Quieres 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 "dogegoría". la función regexp_replace puede ayudarle a definir un patrón de coincidencia más estricto para lo que desea reemplazar.

Jerome WAGNER avatar Feb 20 '2011 22:02 Jerome WAGNER

La forma de expresión regular

Si necesita una coincidencia de reemplazo más estricta, regexp_replacela funció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 coincidencias globales y que no distinguen entre 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 errores al realizar el reemplazo de expresiones regulares. Veamos qué fácil es sustituir un gato por 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 sin resolver. Por ejemplo, las oraciones que comienzan con "Gato" se reemplazarán con "perro" en minúscula, lo que elimina el uso de mayúsculas en la oración.

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

Actualizar toda la columna con texto de reemplazo

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

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Clint Pachl avatar Jul 23 '2015 09:07 Clint Pachl