sql >> Base de Datos >  >> RDS >> SQLite

Cómo ordenar por nombre de mes en SQLite

Problema:

Desea ordenar las filas por número de mes, dados los nombres de los meses (desea que enero se muestre primero, diciembre último).

Ejemplo:

El birthday la tabla contiene dos columnas:nombre y birthday_month . Los meses se dan en nombres, no en números.

nombre mes_cumpleaños
Ronan Tisha enero
Diciembre abril
Angie Julia abril
Narelle Dillan abril
Purdie Casey enero
Donna Nell NULO
Blaze Graeme octubre

Desea ordenar las filas por birthday_month .

Solución:

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);

El resultado se ve así (las filas están ordenadas en orden ascendente por birthday_month ):

nombre mes_cumpleaños
Purdie Casey enero
Angie Julia abril
Narelle Dillan abril
Blaze Graeme octubre
Ronan Tisha enero
Diciembre NULO
Donna Nell NULO

Discusión:

Para ordenar las filas por mes, necesita los meses en números (no nombres). Puede convertir los nombres de los meses en meses numéricos usando CASE WHEN cláusula. Después del CASE palabra clave, especifique el nombre de la columna. Luego, después de cada WHEN , indique el valor en esta columna, use THEN palabra clave y especifique el nuevo valor que le gustaría asignar en lugar del anterior. Aquí, la columna es birthday_month , los valores actuales en esta columna son 'January ', 'February ', …, 'December ', y los nuevos valores son los meses numéricos 1 , 2, …, 12 . Después de terminar de convertir todos los valores, recuerde usar el END palabra clave para cerrar el CASE WHEN cláusula. Echa un vistazo:

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

Así es como convierte el nombre de un mes en un número de mes. Puede usarlo para ordenar las filas en orden ascendente por mes; solo utilícelo en ORDER BY cláusula.

Tenga en cuenta que en SQLite, NULL Los correos electrónicos se muestran primero cuando se clasifican en orden ascendente y los últimos cuando se clasifican en orden descendente. Además, las filas con el mismo birthday_month se muestran en orden aleatorio (es posible que vea Angie Julia segundo y Narelle Dillan tercero, o Narelle Dillan segundo y Angie Julia tercera). Para cambiar el orden a descendente, use el DESC palabra clave después de la columna en ORDER BY cláusula. Así es como debería verse la consulta:

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;