sql >> Database >  >> RDS >> PostgreSQL

Vervang een tekenreeks door een andere tekenreeks uit een lijst, afhankelijk van de waarde

Voor een paar wederzijds uitsluitende vervangingen, geneste vervangingsinstructies zijn de eenvoudigste en snelste manier. Gewoon zoals @Gordon suggereert .

Maar dat schaalt niet goed voor meer dan een paar vervangingen en er zijn valkuilen :

Subtekenreeksen

Het wordt dubbelzinnig wanneer strings substrings van elkaar kunnen zijn. Overweeg deze twee uitdrukkingen:

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

Het resultaat hangt af van de volgorde van vervangingen. Je moet prioriteiten stellen. Normaal gesproken zou je eerst langere snaren vervangen.

Kettingen

Dan is er ook de mogelijkheid dat de ene vervanger een match voor de volgende creëert:

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

Nogmaals, je moet prioriteiten definiëren.
Elke vervanging heeft mogelijk invloed op de volgende. Met meer dan een paar vervangingen wordt dit snel troebel en foutgevoelig. Ook erg moeilijk te onderhouden als vervangingen kunnen veranderen.

Zoals ik al zei, met alleen de dagen van de week, geneste replace() uitspraken zijn prima. Dat is niet echt "dynamisch". Als doordeweekse dagen alleen maar het probleem zouden illustreren en je eigenlijk met meer gevallen of echt dynamische strings te maken hebt, zou ik een andere aanpak overwegen. Vind volledig dynamische oplossingen in dit gerelateerde antwoord:



  1. Wat is het verschil tussen Is Not Null en Not Is Null?

  2. Trigger in mysql veroorzaakt fout

  3. Over het nut van expressie-indexen

  4. SQL Developer geeft geen XML weer