sql >> Base de Datos >  >> RDS >> PostgreSQL

Reemplace una cadena con otra cadena de una lista según el valor

Para un par de mutuamente excluyentes reemplazos, las declaraciones de reemplazo anidadas son la forma más simple y rápida. Solo como sugiere @Gordon .

Pero eso no escala bien para más de unos pocos reemplazos y hay trampas :

Subcadenas

Se vuelve ambiguo cuando las cadenas pueden ser subcadenas entre sí. Considere estas dos expresiones:

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

El resultado depende de la secuencia de reemplazos. Hay que definir prioridades. Por lo general, primero reemplazaría las cadenas más largas.

Cadenas

Luego también existe la posibilidad de que un reemplazo pueda crear una coincidencia para el siguiente:

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

Una vez más, debe definir las prioridades.
Cada reemplazo posiblemente influya en el siguiente. Con más de unos pocos reemplazos, esto se vuelve turbio y propenso a errores rápidamente. También es muy difícil de mantener si los reemplazos pueden cambiar.

Como dije, con solo los días de la semana, replace() anidado las declaraciones estan bien. Eso no es realmente "dinámico". Si los días de semana fueran solo para ilustrar el problema y realmente tuviera que lidiar con más casos o cadenas verdaderamente dinámicas, consideraría un enfoque diferente. Encuentre soluciones completamente dinámicas en esta respuesta relacionada: