sql >> データベース >  >> RDS >> PostgreSQL

値に応じて、文字列をリストの別の文字列に置き換えます

    いくつかの相互に排他的 置換、ネストされた置換ステートメントは、最も簡単で最速の方法です。 @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() ステートメントは問題ありません。それは実際には「動的」ではありません。平日が問題を説明するためだけであり、実際により多くのケースまたは真に動的な文字列を処理する必要がある場合は、別のアプローチを検討します。完全に動的なソリューションを見つける この関連する回答の中で:



    1. MySQL階層データの隣接リストモデルと入れ子集合モデル?

    2. SQLServerで更新した行のIDを取得する

    3. MYSQLに時刻2009-09-2218:09:37.881を挿入する方法私の列タイプはDateTimeです

    4. 参照テーブルの特定のキーに一致する一意の制約はありません