PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Remplacer une chaîne par une autre chaîne d'une liste en fonction de la valeur

Pour un couple mutuellement exclusif remplacements, les instructions de remplacement imbriquées sont le moyen le plus simple et le plus rapide. Juste comme le suggère @Gordon .

Mais cela ne s'adapte pas bien à plus de quelques remplacements et il y a des écueils :

Sous-chaînes

Cela devient ambigu lorsque les chaînes peuvent être des sous-chaînes les unes des autres. Considérez ces deux expressions :

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

Le résultat dépend de la séquence des remplacements. Il faut définir des priorités. En règle générale, vous remplacerez d'abord les chaînes les plus longues.

Chaînes

Ensuite, il est également possible qu'un remplaçant crée une correspondance pour le suivant :

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

Encore une fois, vous devez définir des priorités.
Chaque remplacement influence éventuellement le suivant. Avec plus de quelques remplacements, cela devient rapidement trouble et sujet aux erreurs. Aussi très difficile à entretenir si les remplacements peuvent changer.

Comme je l'ai dit, avec seulement les jours de la semaine, replace() imbriqué les déclarations sont bonnes. Ce n'est pas vraiment "dynamique". Si les jours de la semaine n'étaient que pour illustrer le problème et que vous deviez en fait traiter plus de cas ou de chaînes vraiment dynamiques, j'envisagerais une approche différente. Trouvez des solutions complètement dynamiques dans cette réponse connexe :