いくつかの相互に排他的 置換、ネストされた置換ステートメントは、最も簡単で最速の方法です。 @Gordonが提案するように
しかし、それは数回以上の交換ではうまく拡張できず、落とし穴があります :
部分文字列
文字列が相互のサブ文字列になる可能性がある場合は、あいまいになります。次の2つの式を検討してください。
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
, replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');
結果は、交換の順序によって異なります。優先順位を定義する必要があります。通常、最初に長い文字列を置き換えます。
チェーン
次に、1つの置換が次の置換に一致する可能性もあります:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
, replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');
繰り返しになりますが、優先順位を定義する必要があります。
すべての置換は、次の置換に影響を与える可能性があります。数回以上の交換を行うと、これは曖昧になり、すぐにエラーが発生しやすくなります。また、交換品が変更される可能性がある場合、保守が非常に困難です。
私が言ったように、曜日だけで、ネストされたreplace()
ステートメントは問題ありません。それは実際には「動的」ではありません。平日が問題を説明するためだけであり、実際により多くのケースまたは真に動的な文字列を処理する必要がある場合は、別のアプローチを検討します。完全に動的なソリューションを見つける この関連する回答の中で: