För ett par ömsesidigt uteslutande ersättningar, kapslade ersätt-satser är det enklaste och snabbaste sättet. Bara som @Gordon föreslår .
Men det kan inte skalas bra för mer än några byten och det finns fallgropar :
Substrängar
Det blir tvetydigt när strängar kan vara delsträngar till varandra. Tänk på dessa två uttryck:
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
, replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');
Resultatet beror på sekvensen av ersättningar. Du måste definiera prioriteringar. Vanligtvis skulle du byta ut längre strängar först.
Kedjor
Sedan finns det också möjligheten att en ersättare kan skapa en matchning för nästa:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
, replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');
Återigen måste du definiera prioriteringar.
Varje ersättare påverkar möjligen nästa. Med fler än ett fåtal byten blir detta grumligt och felbenäget snabbt. Också mycket svårt att underhålla om ersättningar kan ändras.
Som jag sa, med bara veckodagarna, kapslade replace()
uttalanden är bra. Det är faktiskt inte "dynamiskt". Om vardagar bara var för att illustrera problemet och du faktiskt måste hantera fler fall eller verkligt dynamiska strängar, skulle jag överväga ett annat tillvägagångssätt. Hitta helt dynamiska lösningar i detta relaterade svar: