In postgresql, come posso sostituire tutte le istanze di una stringa all'interno di una colonna del database?
Supponiamo di voler sostituire tutte le istanze di cat
con dog
, ad esempio.
Qual'è il miglior modo per farlo?
In postgresql, come posso sostituire tutte le istanze di una stringa all'interno di una colonna del database?
Supponiamo di voler sostituire tutte le istanze di cat
con dog
, ad esempio.
Qual'è il miglior modo per farlo?
Risposte:
Vuoi usare la funzione di sostituzione di postgresql :
replace(string text, from text, to text)
per esempio :
UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')
Tuttavia, tieni presente che si tratterà di una sostituzione da stringa a stringa, quindi "categoria" diventerà "dogegoria". la funzione regexp_replace può aiutarti a definire un modello di corrispondenza più rigoroso per ciò che desideri sostituire.
regexp_replace
Se è necessaria una corrispondenza di sostituzione più rigorosa, la regexp_replace
funzione di PostgreSQL può corrispondere utilizzando i modelli di espressioni regolari POSIX. Ha la sintassi regexp_replace (sorgente, modello, sostituzione [, flag]) .
Userò le bandiere i
e g
per la corrispondenza senza distinzione maiuscole e minuscole, rispettivamente. Userò anche \m
e \M
per abbinare l'inizio e la fine di una parola, rispettivamente.
Di solito ci sono parecchi gotcha quando si esegue la sostituzione di regex. Vediamo com'è facile sostituire un gatto con un cane .
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
Anche dopo tutto ciò, esiste almeno una condizione irrisolta. Ad esempio, le frasi che iniziano con "Gatto" verranno sostituite da "cane" minuscolo che spezza la maiuscola della frase.
Controlla gli attuali documenti PostgreSQL corrispondenti per tutti i dettagli.
Dati i miei esempi, forse l'opzione più sicura sarebbe:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Puoi usare la replace
funzione
UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')
La definizione della funzione è la seguente (ottenuta da qui ):
replace(string text, from text, to text)
e restituisce il testo modificato. Puoi anche dare un'occhiata a questo violino sql .
Ecco un esempio che sostituisce tutte le istanze di 1 o più caratteri di spazio bianco in una colonna con un trattino basso usando l'espressione regolare -
select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;