PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Substituir uma string por outra string de uma lista dependendo do valor


Para alguns mutuamente exclusivos substituições, instruções de substituição aninhadas são a maneira mais simples e rápida. Apenas como @Gordon sugere .

Mas isso não funciona bem para mais do que algumas substituições e existem armadilhas :

Substrings


Torna-se ambíguo quando as strings podem ser substrings umas das outras. Considere estas duas expressões:
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
     , replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');

O resultado depende da sequência de substituições. Você tem que definir prioridades. Normalmente, você substituiria as strings mais longas primeiro.

Correntes


Depois, há também a possibilidade de que uma substituição possa criar uma correspondência para a próxima:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
     , replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');

Novamente, você tem que definir prioridades.
Cada substituição possivelmente influencia a próxima. Com mais do que algumas substituições, isso se torna obscuro e propenso a erros rapidamente. Também muito difícil de manter se as substituições podem mudar.

Como eu disse, com apenas os dias da semana, replace() aninhado declarações estão bem. Isso não é realmente "dinâmico". Se os dias da semana fossem apenas para ilustrar o problema e você realmente tivesse que lidar com mais casos ou strings verdadeiramente dinâmicas, eu consideraria uma abordagem diferente. Encontre soluções totalmente dinâmicas nesta resposta relacionada: