sql >> Databáze >  >> RDS >> Mysql

Coalesce ekvivalent pro n-tou nenulovou hodnotu - MySQL

Nejsem si jistý, zda bych toto řešení doporučil... normalizace vašich dat je vždy lepší volbou, ale chtěl jsem odpovědět pomocí prostého SQL s některými funkcemi řetězců. Tento dotaz by měl vrátit to, co hledáte:

SELECT
  Name,
  Changes,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
  SELECT
    Name,
    CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
  FROM
    TableA
) s

Zřetězuji všechny hodnoty do řetězce odděleného čárkami, se dvěma čárkami na konci řetězce (stejně by stačila jedna čárka, ale je jednodušší dát dvě a tu poslední prostě ignorovat...), a protože jsem' m pomocí CONCAT_WS automaticky přeskočí hodnoty null a výsledný řetězec bude něco jako Aug-12,Jun-12,Apr-12,, .

Pak ve vnějším dotazu extrahuji n-tý prvek řetězce pomocí SUBSTRIG_INDEX. Doporučil bych normalizovat vaši databázi, ale pokud potřebujete rychlou opravu, toto řešení může být dobrým výchozím bodem.

Podívejte se, jak to funguje zde .

Všimněte si prosím, že nevracím hodnoty NULL, kde nejsou žádné změny, ale místo toho vracím prázdné řetězce. Toto lze v případě potřeby změnit.



  1. Mám vytvořit nové pole v tabulce nebo jen vybrat MAX druhé tabulky

  2. Opětovné podřízení havarovaného hlavního serveru MySQL v nastavení semisynchronní replikace

  3. Vnitřní mechanismus JDBC ResultSet pro načítání velkých datových sad

  4. Automatizujte mysql_secure_installation pomocí příkazu echo pomocí skriptu shellu