Dla kilku wzajemnie wykluczających się zamienniki, zagnieżdżone instrukcje zamiany to najprostszy i najszybszy sposób. Po prostu jak sugeruje @Gordon .
Ale to nie skaluje się dobrze dla więcej niż kilku wymian i istnieją pułapki :
Podciągi
Staje się niejednoznaczne, gdy ciągi mogą być podciągami siebie nawzajem. Rozważ te dwa wyrażenia:
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
, replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');
Wynik zależy od kolejności wymian. Musisz określić priorytety. Zazwyczaj najpierw zamieniasz dłuższe ciągi.
Łańcuchy
Istnieje również możliwość, że jeden zamiennik może stworzyć dopasowanie do następnego:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
, replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');
Ponownie, musisz zdefiniować priorytety.
Każda zamiana może mieć wpływ na następną. Przy więcej niż kilku wymianach szybko staje się to niejasne i podatne na błędy. Również bardzo trudne do utrzymania, jeśli zamienniki mogą ulec zmianie.
Jak powiedziałem, tylko z dniami tygodnia, zagnieżdżone replace()
oświadczenia są w porządku. To nie jest właściwie „dynamiczne”. Gdyby dni powszednie miały tylko zilustrować problem, a faktycznie masz do czynienia z większą liczbą przypadków lub naprawdę dynamicznych ciągów, rozważyłbym inne podejście. Znajdź całkowicie dynamiczne rozwiązania w tej powiązanej odpowiedzi: