Mysql
 sql >> Base de données >  >> RDS >> Mysql

Coalesce équivalent pour la nième valeur non nulle - MySQL

Je ne sais pas si je recommanderais d'utiliser cette solution... la normalisation de vos données est toujours un meilleur choix, mais je voulais répondre en utilisant du SQL simple avec quelques fonctions de chaînes. Cette requête devrait renvoyer ce que vous recherchez :

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

Je concatène toutes les valeurs dans une chaîne séparée par des virgules, avec deux virgules à la fin de la chaîne (une virgule suffirait de toute façon, mais il est plus facile d'en mettre deux et d'ignorer la dernière...), et puisque je ' m en utilisant CONCAT_WS, il ignorera automatiquement les valeurs nulles et la chaîne résultante ressemblera à Aug-12,Jun-12,Apr-12,, .

Ensuite, dans la requête externe, j'extrait le n-ième élément de la chaîne, en utilisant SUBSTRIG_INDEX. Je recommanderais de normaliser votre base de données, mais si vous avez besoin d'une solution rapide, cette solution pourrait être un bon point de départ.

Voir le fonctionnement ici .

Veuillez noter que je ne renvoie pas de valeurs NULL lorsqu'il n'y a pas de changement, mais que je renvoie des chaînes vides à la place. Cela peut être modifié si vous en avez besoin.