sintaxis sentencia que enum data comando mysql sql enums sql-order-by

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 valores ENUM 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'' para ENUM(''b'', ''a'') . La cadena vacía se ordena antes de las cadenas no vacías y los valores NULL 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 columna ENUM , 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) o ORDER 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.