PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zastąp ciąg innym ciągiem z listy w zależności od wartości

Dla kilku wzajemnie wykluczających się zamienniki, zagnieżdżone instrukcje zamiany to najprostszy i najszybszy sposób. Po prostu jak sugeruje @Gordon .

Ale to nie skaluje się dobrze dla więcej niż kilku wymian i istnieją pułapki :

Podciągi

Staje się niejednoznaczne, gdy ciągi mogą być podciągami siebie nawzajem. Rozważ te dwa wyrażenia:

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

Wynik zależy od kolejności wymian. Musisz określić priorytety. Zazwyczaj najpierw zamieniasz dłuższe ciągi.

Łańcuchy

Istnieje również możliwość, że jeden zamiennik może stworzyć dopasowanie do następnego:

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

Ponownie, musisz zdefiniować priorytety.
Każda zamiana może mieć wpływ na następną. Przy więcej niż kilku wymianach szybko staje się to niejasne i podatne na błędy. Również bardzo trudne do utrzymania, jeśli zamienniki mogą ulec zmianie.

Jak powiedziałem, tylko z dniami tygodnia, zagnieżdżone replace() oświadczenia są w porządku. To nie jest właściwie „dynamiczne”. Gdyby dni powszednie miały tylko zilustrować problem, a faktycznie masz do czynienia z większą liczbą przypadków lub naprawdę dynamicznych ciągów, rozważyłbym inne podejście. Znajdź całkowicie dynamiczne rozwiązania w tej powiązanej odpowiedzi:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć się z bazą danych Postgres bez hasła za pomocą pg-promise?

  2. Dlaczego nie mogę wysyłać zapytań bezpośrednio do jsonb_array_elements?

  3. Jak zrobić system budowania dla PostgreSQL

  4. Dodaj wskaźnik porządkowy do daty w PostgreSQL

  5. PostgreSQL — funkcja ze zmiennymi lokalnymi — odwołanie do kolumny jest niejednoznaczne