venerdì 9 maggio 2008

Sostituzione di stringhe tramite espressione regolare

PostgreSQL mette a disposizione una comoda funzione, regexp_replace, che come la sua cugina replace consente di cambiare una stringa con un'altra facendo un azione di pattern matching basato su espressione regolare POSIX.

Supponiamo di dover cambiare tutti i campi codice di una tabella ove i codici finiscano con la stringa ABCDEFG oppure DEFG, sia in minuscolo che in maiuscolo. Una soluzione può essere la seguente:

update myTable set codice = regexp_replace( upper(codice), '(ABC)*DEFG$', '')
where upper(codice) ~ '(ABC)*DEFG$'
dove si ricercano i record che finiscono con ABCDEFG oppure solo DEFG e si sostituisce l'occorenza trovata con una stringa vuota. Per riuscire a fare la sostituzione sia nel caso di maiuscole/minuscole, si noti come il codice viene comunque trasformato in maiuscolo (tramite upper) e come si confronti la stringa con una espressione regolare in maiuscolo.

Va notato che nel caso la stringa da sostituire sia presente più di una volta, come ade esempio DEFGDEFG, è necessario usare un quantificatore nell'espressione regolare, che quindi diventa:

update myTable set codice = regexp_replace( upper(codice), '(ABC)*(DEFG)+$', '')
where upper(codice) ~ '(ABC)*(DEFG)+$'
in questo caso viene sostituita ogni occorrenza (da una a più) della stringa DEFG.

Ovviamente è bene eseguire questo update all'interno di una transazione.

Nessun commento: