sql >> Databasteknik >  >> RDS >> SQLite

Hur man beställer efter månadsnamn i SQLite

Problem:

Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).

Exempel:

birthday Tabellen innehåller två kolumner:namn och birthday_month . Månaderna anges i namn, inte i siffror.

namn födelsedag_månad
Ronan Tisha Januari
December April
Angie Julia April
Narelle Dillan April
Purdie Casey Januari
Donna Nell NULL
Blaze Graeme Oktober

Du vill sortera raderna efter birthday_month .

Lösning:

SELECT *
FROM birthday
ORDER BY
 (CASE birthday_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END);

Resultatet ser ut så här (raderna är sorterade i stigande ordning efter birthday_month ):

namn födelsedag_månad
Purdie Casey Januari
Angie Julia April
Narelle Dillan April
Blaze Graeme Oktober
Ronan Tisha Januari
December NULL
Donna Nell NULL

Diskussion:

För att sortera raderna efter månad behöver du månaderna i siffror (inte namn). Du kan konvertera månadsnamn till numeriska månader med hjälp av CASE WHEN klausul. Efter CASE nyckelord, ange namnet på kolumnen. Sedan, efter varje WHEN , ange värdet i den här kolumnen, använd THEN nyckelord och ange det nya värdet du vill tilldela istället för det gamla. Här är kolumnen birthday_month , de aktuella värdena i den här kolumnen är 'January ', 'February ', …, 'December ', och de nya värdena är de numeriska månaderna 1 , 2, …, 12 . När du är klar med att konvertera alla värden, kom ihåg att använda END nyckelord för att stänga CASE WHEN klausul. Ta en titt:

CASE birthday_month
  WHEN 'January' THEN 1
  WHEN 'February' THEN 2
  WHEN 'March' THEN 3
  WHEN 'April' THEN 4
  WHEN 'May' THEN 5
  WHEN 'June' THEN 6
  WHEN 'July' THEN 7
  WHEN 'August' THEN 8
  WHEN 'September' THEN 9
  WHEN 'October' THEN 10
  WHEN 'November' THEN 11
  WHEN 'December' THEN 12
END

Så här konverterar du ett månadsnamn till ett månadsnummer. Du kan använda den för att sortera raderna i stigande ordning efter månad – använd den bara i ORDER BY klausul.

Observera att i SQLite, NULL s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma birthday_month visas i slumpmässig ordning (du kan se Angie Julia andra och Narelle Dillan tredje, eller Narelle Dillan andra och Angie Julia tredje). För att ändra ordningen till fallande, använd DESC nyckelord efter kolumnen i ORDER BY klausul. Så här ska frågan se ut:

SELECT *
FROM birthday
ORDER BY
  (CASE birthday_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END) DESC;

  1. Länk till Salesforce Data i Microsoft Access

  2. Hur migrerar man en befintlig Postgres-tabell till en partitionerad tabell så transparent som möjligt?

  3. Hur man hittar och maskerar PII i Elasticsearch

  4. Förhindrar den här koden SQL-injektion?