sql >> Databasteknik >  >> RDS >> Mysql

Koalesce-ekvivalent för n:te inte null-värde - MySQL

Jag är inte säker på om jag skulle rekommendera att använda den här lösningen... normalisering av dina data är alltid ett bättre val, men jag ville svara med vanlig SQL med några strängfunktioner. Den här frågan bör returnera det du letar efter:

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

Jag sammanfogar alla värden i en kommaseparerad sträng, med två kommatecken i slutet av strängen (ett kommatecken skulle räcka ändå, men det är lättare att sätta två och bara ignorera det sista...), och eftersom jag m med CONCAT_WS hoppar den automatiskt över nollvärden, och den resulterande strängen blir ungefär Aug-12,Jun-12,Apr-12,, .

Sedan extraherar jag det n:te elementet i strängen i den yttre frågan med SUBSTRIG_INDEX. Jag skulle rekommendera att normalisera din databas, men om du behöver en snabb lösning kan den här lösningen vara en bra utgångspunkt.

Se hur det fungerar här .

Observera att jag inte returnerar NULL-värden där det inte finns några ändringar, utan jag returnerar tomma strängar istället. Detta kan ändras om du behöver.



  1. PHP :Använda en variabel för att hålla ett tabellnamn och använda den variabeln i frågor

  2. Oracle-parametrar med IN-sats?

  3. Hur tar jag reda på mitt root MySQL-lösenord?

  4. Släpp tid i DateTime