sql >> Databasteknik >  >> RDS >> PostgreSQL

Ersätt en sträng med en annan sträng från en lista beroende på värdet

För ett par ömsesidigt uteslutande ersättningar, kapslade ersätt-satser är det enklaste och snabbaste sättet. Bara som @Gordon föreslår .

Men det kan inte skalas bra för mer än några byten och det finns fallgropar :

Substrängar

Det blir tvetydigt när strängar kan vara delsträngar till varandra. Tänk på dessa två uttryck:

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

Resultatet beror på sekvensen av ersättningar. Du måste definiera prioriteringar. Vanligtvis skulle du byta ut längre strängar först.

Kedjor

Sedan finns det också möjligheten att en ersättare kan skapa en matchning för nästa:

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

Återigen måste du definiera prioriteringar.
Varje ersättare påverkar möjligen nästa. Med fler än ett fåtal byten blir detta grumligt och felbenäget snabbt. Också mycket svårt att underhålla om ersättningar kan ändras.

Som jag sa, med bara veckodagarna, kapslade replace() uttalanden är bra. Det är faktiskt inte "dynamiskt". Om vardagar bara var för att illustrera problemet och du faktiskt måste hantera fler fall eller verkligt dynamiska strängar, skulle jag överväga ett annat tillvägagångssätt. Hitta helt dynamiska lösningar i detta relaterade svar:



  1. Sekvenser med sammansatt primärnyckel

  2. VÄLJ rader med minsta antal(*)

  3. Hur man lagrar en Java Instant i en MySQL-databas

  4. SQL Server Användardefinierade funktioner