sentencia - ORDER BY "ENUM field" en MYSQL
sentencia enum (3)
Hay un campo ''noticeBy'' enum (''email'', ''mobile'', ''all'', ''auto'', ''nothing'') NOT NULL DEFAULT ''auto''. Como se conoce, el orden por el campo ENUM se realiza en relación con su índice. Sin embargo, ¿cómo es posible ordenar por sus valores?
Como se documenta en Sorting :
ENUM
valoresENUM
se clasifican según sus números de índice, que dependen del orden en que se enumeraron los miembros de la enumeración en la especificación de la columna. Por ejemplo,''b''
clasifica antes de''a''
paraENUM(''b'', ''a'')
. La cadena vacía se ordena antes de las cadenas no vacías y los valoresNULL
se ordenan antes de todos los demás valores de enumeración.Para evitar resultados inesperados al usar la cláusula
ORDER BY
en una columnaENUM
, use una de estas técnicas:
Especifique la lista
ENUM
en orden alfabético.Asegúrese de que la columna esté ordenada léxicamente en lugar de por número de índice codificando
ORDER BY CAST(col AS CHAR)
oORDER BY CONCAT(col)
.
Por la segunda viñeta, por lo tanto, puede ordenar en la columna después de que se haya cast en una cadena:
ORDER BY CAST(noticeBy AS CHAR)
Esto también funciona:
ORDER BY FIELD(noticeBy, ''all'',''auto'',''email'',''mobile'',''nothing'')
(No creo que haya una configuración para lograr esto, tiene que proporcionar los valores de clasificación).
Puedes definir tu pedido como desees:
ORDER BY CASE noticeBy
WHEN ''email'' THEN 1
WHEN ''mobile'' THEN 2
WHEN ''all'' THEN 3
WHEN ''auto'' THEN 4
ELSE 5
END
Esto devolverá las filas en el siguiente orden: correo electrónico, móvil, todo, automático, nada.