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?
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?
Respuestas:
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.
regexp_replace
Si necesita una coincidencia de reemplazo más estricta, la regexp_replace
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 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 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.
Dados mis ejemplos, tal vez la opción más segura sería:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Puedes usar la replace
funció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 .
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;