postgresql: reemplaza todas las instancias de una cadena dentro del campo de texto
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 cat
con dog
, por ejemplo.
¿Cuál es la mejor manera de hacer esto?
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.
La forma de expresión regular
Si necesita una coincidencia de reemplazo más estricta, regexp_replace
la 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 i
y g
para coincidencias globales y que no distinguen entre mayúsculas y minúsculas, respectivamente. También usaré \m
y \M
para 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');