web-dev-qa-db-fra.com

Commande MySQL Par un numéro, Nulls last

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.
251
JonB

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

527
user1052645

J'ai trouvé que c'était une bonne solution pour la plupart:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;
285
d-_-b

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

23
DrewM

NULL LAST

SELECT * FROM table_name ORDER BY id IS NULL, id ASC
16
sumeet

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
4
Rachit Patel

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
3
Langdon

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

3
Seth
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
3
YasirPoongadan

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
2
Danny Beckett