Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Coalesce-Äquivalent für n-ten Nicht-Null-Wert - MySQL

Ich bin mir nicht sicher, ob ich die Verwendung dieser Lösung empfehlen würde ... die Normalisierung Ihrer Daten ist immer eine bessere Wahl, aber ich wollte mit einfachem SQL mit einigen Zeichenfolgenfunktionen antworten. Diese Abfrage sollte zurückgeben, wonach Sie suchen:

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

Ich verkette alle Werte in einer durch Kommas getrennten Zeichenfolge mit zwei Kommas am Ende der Zeichenfolge (ein Komma würde sowieso ausreichen, aber es ist einfacher, zwei zu setzen und das letzte einfach zu ignorieren ...), und da ich ' Wenn Sie CONCAT_WS verwenden, werden Nullwerte automatisch übersprungen, und die resultierende Zeichenfolge ist so etwas wie Aug-12,Jun-12,Apr-12,, .

Dann extrahiere ich in der äußeren Abfrage das n-te Element der Zeichenfolge mit SUBSTRIG_INDEX. Ich würde empfehlen, Ihre Datenbank zu normalisieren, aber wenn Sie eine schnelle Lösung benötigen, könnte diese Lösung ein guter Ausgangspunkt sein.

Sehen Sie, wie es hier funktioniert .

Bitte beachten Sie, dass ich keine NULL-Werte zurückgebe, wo es keine Änderungen gibt, sondern ich gebe stattdessen leere Zeichenfolgen zurück. Dies kann bei Bedarf geändert werden.