Mysql
 sql >> Database >  >> RDS >> Mysql

Coalesce equivalente per l'ennesimo valore non nullo - MySQL

Non sono sicuro se consiglierei di utilizzare questa soluzione ... la normalizzazione dei dati è sempre una scelta migliore, ma volevo rispondere utilizzando un semplice SQL con alcune funzioni di stringhe. Questa query dovrebbe restituire ciò che stai cercando:

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

Sto concatenando tutti i valori in una stringa separata da virgole, con due virgole alla fine della stringa (una virgola sarebbe comunque sufficiente, ma è più facile metterne due e ignorare l'ultima...), e dato che io' m usando CONCAT_WS salterà automaticamente i valori null e la stringa risultante sarà qualcosa come Aug-12,Jun-12,Apr-12,, .

Quindi nella query esterna sto estraendo l'n-esimo elemento della stringa, usando SUBSTRIG_INDEX. Consiglierei di normalizzare il database, ma se hai bisogno di una soluzione rapida questa soluzione potrebbe essere un buon punto di partenza.

Guarda come funziona qui .

Si noti che non sto restituendo valori NULL dove non ci sono modifiche, ma sto restituendo invece stringhe vuote. Questo può essere modificato se necessario.