Za pár vzájemně se vylučujících nahrazení, vnořené příkazy nahradit jsou nejjednodušší a nejrychlejší způsob. Prostě jak navrhuje @Gordon .
To však není vhodné pro více než několik výměn a existují úskalí :
Podřetězce
Stává se nejednoznačným, když řetězce mohou být navzájem podřetězci. Zvažte tyto dva výrazy:
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
, replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');
Výsledek závisí na pořadí výměn. Musíte si definovat priority. Obvykle byste nejprve nahradili delší řetězce.
Řetězy
Pak je zde také možnost, že jedna náhrada může vytvořit shodu s další:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
, replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');
Opět musíte definovat priority.
Každá náhrada může ovlivnit další. S více než několika výměnami se to rychle stane nejasným a náchylným k chybám. Je také velmi obtížné udržovat, pokud se náhrady mohou změnit.
Jak jsem řekl, pouze dny v týdnu jsou vnořeny replace()
prohlášení jsou v pořádku. To ve skutečnosti není „dynamické“. Pokud by všední dny byly jen pro ilustraci problému a ve skutečnosti se musíte vypořádat s více případy nebo skutečně dynamickými řetězci, uvažoval bych o jiném přístupu. Najděte zcela dynamická řešení v této související odpovědi: