Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Equivalente de coalescência para n-ésimo valor não nulo - MySQL


Não tenho certeza se recomendaria usar esta solução... a normalização de seus dados é sempre uma escolha melhor, mas eu queria responder usando SQL simples com algumas funções de strings. Esta consulta deve retornar o que você está procurando:
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

Estou concatenando todos os valores em uma string separada por vírgula, com duas vírgulas no final da string (uma vírgula seria suficiente de qualquer maneira, mas é mais fácil colocar duas e ignorar a última...), e já que eu ' m usando CONCAT_WS ele pulará automaticamente valores nulos, e a string resultante será algo como Aug-12,Jun-12,Apr-12,, .

Então, na consulta externa, estou extraindo o n-ésimo elemento da string, usando SUBSTRIG_INDEX. Eu recomendaria normalizar seu banco de dados, mas se você precisar de uma solução rápida, esta solução pode ser um bom ponto de partida.

Veja funcionando aqui .

Observe que não estou retornando valores NULL onde não há alterações, mas estou retornando strings vazias. Isso pode ser alterado se você precisar.