Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tri naturel SQL ORDER BY

Cela le fera :

SELECT value
FROM Table1
ORDER BY value REGEXP '^[A-Za-z]+$'
        ,CAST(value as SIGNED INTEGER)
        ,CAST(REPLACE(value,'-','')AS SIGNED INTEGER)
        ,value

Les 4 niveaux de the ORDER BY :

  1. REGEXP attribue à toute ligne alpha un 1 et non alpha à 0
  2. SIGNED INT Trie tous les nombres par la partie précédant le tiret.
  3. SIGNED INT après avoir supprimé le tiret, trie tous les éléments ayant la même valeur avant le tiret par la partie après le tiret. Pourrait potentiellement remplacer le numéro 2, mais ne voudrait pas traiter 90-1 de la même manière que 9-01 si le cas se présentait.
  4. Trie les lettres par ordre alphabétique.

Démo :SQL Fiddle