sql >> Databáze >  >> RDS >> PostgreSQL

Nahraďte řetězec jiným řetězcem ze seznamu v závislosti na hodnotě

Za pár vzájemně se vylučujících nahrazení, vnořené příkazy nahradit jsou nejjednodušší a nejrychlejší způsob. Prostě jak navrhuje @Gordon .

To však není vhodné pro více než několik výměn a existují úskalí :

Podřetězce

Stává se nejednoznačným, když řetězce mohou být navzájem podřetězci. Zvažte tyto dva výrazy:

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

Výsledek závisí na pořadí výměn. Musíte si definovat priority. Obvykle byste nejprve nahradili delší řetězce.

Řetězy

Pak je zde také možnost, že jedna náhrada může vytvořit shodu s další:

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

Opět musíte definovat priority.
Každá náhrada může ovlivnit další. S více než několika výměnami se to rychle stane nejasným a náchylným k chybám. Je také velmi obtížné udržovat, pokud se náhrady mohou změnit.

Jak jsem řekl, pouze dny v týdnu jsou vnořeny replace() prohlášení jsou v pořádku. To ve skutečnosti není „dynamické“. Pokud by všední dny byly jen pro ilustraci problému a ve skutečnosti se musíte vypořádat s více případy nebo skutečně dynamickými řetězci, uvažoval bych o jiném přístupu. Najděte zcela dynamická řešení v této související odpovědi:



  1. Parametrizovaný dynamický dotaz SQL

  2. Jak načíst soubor JAR v databázi Oracle?

  3. MySQL Group_Concat() vs T-SQL String_Agg()

  4. Výběr řádků z tabulky, které mají stejnou hodnotu pro jedno pole