Actuellement, je fais une commande très basique dans ma déclaration.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
Le problème avec ceci est que les entrées NULL pour 'position' sont traitées en tant que 0. Par conséquent, toutes les entrées avec la position NULL apparaissent avant celles avec 1,2,3,4. par exemple:
NULL, NULL, NULL, 1, 2, 3, 4
Existe-t-il un moyen de réaliser les commandes suivantes:
1, 2, 3, 4, NULL, NULL, NULL.
MySQL a une syntaxe non documentée pour trier les valeurs NULL en dernier. Placez un signe moins (-) devant le nom de la colonne et réglez l’ASC sur DESC:
SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC
Il s’agit essentiellement de l’inverse de position DESC
plaçant les valeurs NULL en dernier mais identiques à position ASC
.
Une bonne référence est ici http://troels.arvin.dk/db/rdbms#select-order_by
J'ai trouvé que c'était une bonne solution pour la plupart:
SELECT * FROM table ORDER BY ISNULL(field), field ASC;
Quelque chose comme
SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
Remplacez 999999999 par la valeur maximale du champ
NULL LAST
SELECT * FROM table_name ORDER BY id IS NULL, id ASC
Essayez d'utiliser cette requête:
SELECT * FROM tablename
WHERE visible=1
ORDER BY
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
Vous pouvez échanger des occurrences de NULL avec une valeur différente pour les trier en premier (comme 0 ou -1) ou en dernier lieu (un grand nombre ou une lettre) ...
SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
FROM tablename
WHERE visible = 1
ORDER BY ordered_field2 ASC, id DESC
Vous pouvez fusionner vos NULL dans l'instruction ORDER BY
:
select * from tablename
where <conditions>
order by
coalesce(position, 0) ASC,
id DESC
Si vous souhaitez que les valeurs NULL soient triées en bas, essayez coalesce(position, 100000)
. (Faites en sorte que le deuxième nombre soit plus grand que tous les autres position
de la base.)
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
Pour une colonne DATE
, vous pouvez utiliser:
NULLS last:
ORDER BY IFNULL(`myDate`, '9999-12-31') ASC
dernier blanc:
ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC