PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sostituisci una stringa con un'altra stringa da un elenco a seconda del valore

Per un paio di mutuamente esclusive sostituzioni, le istruzioni di sostituzione annidate sono il modo più semplice e veloce. Solo come suggerisce @Gordon .

Ma ciò non si adatta bene per più di alcune sostituzioni e ci sono insidie :

Sottostringhe

Diventa ambiguo quando le stringhe possono essere sottostringhe l'una dell'altra. Considera queste due espressioni:

SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
     , replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');

Il risultato dipende dalla sequenza delle sostituzioni. Devi definire le priorità. In genere sostituiresti prima le stringhe più lunghe.

Catene

Poi c'è anche la possibilità che un sostituto crei una corrispondenza per il successivo:

SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
     , replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');

Ancora una volta, devi definire le priorità.
Ogni sostituzione può influenzare il successivo. Con più di poche sostituzioni, questo diventa oscuro e soggetto a errori rapidamente. Anche molto difficile da mantenere se le sostituzioni possono cambiare.

Come ho detto, con solo i giorni della settimana, nidificati replace() le dichiarazioni vanno bene. In realtà non è "dinamico". Se i giorni feriali dovessero solo illustrare il problema e dovessi effettivamente occuparti di più casi o stringhe veramente dinamiche, prenderei in considerazione un approccio diverso. Trova completamente soluzioni dinamiche in questa risposta correlata: