PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ersetzen Sie je nach Wert eine Zeichenfolge durch eine andere Zeichenfolge aus einer Liste

Für ein paar die sich gegenseitig ausschließen Ersetzungen, verschachtelte Ersetzungsanweisungen sind der einfachste und schnellste Weg. Nur wie @Gordon vorschlägt .

Aber das skaliert nicht gut für mehr als ein paar Ersetzungen und es gibt Fallstricke :

Teilstrings

Mehrdeutig wird es, wenn Strings Teilstrings voneinander sein können. Betrachten Sie diese beiden Ausdrücke:

SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
     , replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');

Das Ergebnis hängt von der Reihenfolge der Ersetzungen ab. Sie müssen Prioritäten setzen. Typischerweise würden Sie zuerst längere Zeichenfolgen ersetzen.

Ketten

Dann besteht auch die Möglichkeit, dass eine Ersetzung eine Übereinstimmung mit der nächsten schafft:

SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
     , replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');

Auch hier gilt es, Prioritäten zu setzen.
Jeder Wechsel beeinflusst möglicherweise den nächsten. Mit mehr als ein paar Ersetzungen wird dies schnell undurchsichtig und fehleranfällig. Auch sehr schwer zu warten, wenn sich der Ersatz ändern kann.

Wie gesagt, nur mit den Wochentagen, verschachteltes replace() Aussagen sind in Ordnung. Das ist nicht wirklich "dynamisch". Wenn Wochentage nur das Problem veranschaulichen sollen und Sie sich tatsächlich mit mehr Fällen oder wirklich dynamischen Zeichenfolgen befassen müssen, würde ich einen anderen Ansatz in Betracht ziehen. Finden Sie völlig dynamische Lösungen in dieser verwandten Antwort: