sql >> Database teknologi >  >> RDS >> PostgreSQL

Erstat en streng med en anden streng fra en liste afhængigt af værdien

For et par gensidigt udelukkende erstatninger, indlejrede erstatningsudsagn er den enkleste og hurtigste måde. Bare som @Gordon foreslår .

Men det kan ikke skaleres godt til mere end et par udskiftninger, og der er faldgruber :

Understrenge

Det bliver tvetydigt, når strenge kan være understrenge af hinanden. Overvej disse to udtryk:

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

Resultatet afhænger af rækkefølgen af ​​udskiftninger. Du skal definere prioriteter. Typisk ville du erstatte længere strenge først.

Kæder

Så er der også mulighed for, at den ene udskiftning kan skabe et match til den næste:

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

Igen skal du definere prioriteter.
Hver udskiftning påvirker muligvis den næste. Med mere end et par udskiftninger bliver dette uklart og hurtigt udsat for fejl. Også meget svært at vedligeholde, hvis udskiftninger kan ændre sig.

Som jeg sagde, med kun ugedagene, indlejrede replace() udtalelser er fine. Det er faktisk ikke "dynamisk". Hvis hverdage blot skulle illustrere problemet, og du faktisk skal håndtere flere cases eller virkelig dynamiske strenge, ville jeg overveje en anden tilgang. Find fuldstændig dynamiske løsninger i dette relaterede svar:



  1. Sådan viser du sorteringen af ​​en tabel i MySQL

  2. Forespørgsel for at få samlede ordrer afgivet af en bestemt kunde i sidste år henter gentagne datoer, hvor der ikke eksisterer nogen ordre

  3. Er der nogen MySQL Aggregate Function for CONTAINS?

  4. Beverly Hills 90210 og ZIP+4:Håndtering af adresser i datamodeller