Actuellement, je fais un OrderBy 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 comme 0. Par conséquent, toutes les entrées avec position comme NULL apparaissent avant celles avec 1,2,3,4. par exemple:
NULL, NULL, NULL, 1, 2, 3, 4
Existe-t-il un moyen d'obtenir l'ordre suivant:
1, 2, 3, 4, NULL, NULL, NULL.
mysql
sql-order-by
JonB
la source
la source
Réponses:
MySQL a une syntaxe non documentée pour trier les null en dernier. Placez un signe moins (-) avant le nom de la colonne et passez l'ASC à DESC:
C'est essentiellement l'inverse de
position DESC
placer les valeurs NULL en dernier mais sinon les mêmes queposition ASC
.Une bonne référence est ici http://troels.arvin.dk/db/rdbms#select-order_by
la source
- col_name
c'est une expression (0 - col_name
), que la clause ORDER BY accepte. Bien sûr, cela ne fonctionne que pour les colonnes numériques.date
ettime
colonnes aussi! (MySQL 5.5). Je suppose (je suis paresseux de vérifier) que cela fonctionne pour toutes les colonnes de type numérique (horodatage, float ...).J'ai trouvé que c'était une bonne solution pour la plupart:
la source
SELECT * FROM table ORDER BY ISNULL(field) ASC;
(MySQL 5.5)NULLS LAST
|NULLS FIRST
pour le retourner au lieu des solutions de contournement ici.Quelque chose comme
Remplacez 999999999 par la valeur maximale du champ
la source
NULL DERNIER
la source
Vous pouvez échanger des instances de NULL avec une valeur différente pour les trier en premier (comme 0 ou -1) ou en dernier (un grand nombre ou une lettre) ...
la source
Essayez d'utiliser cette requête:
la source
Vous pouvez fusionner vos NULLs dans l'
ORDER BY
instruction:Si vous souhaitez que les valeurs NULL soient triées en bas, essayez
coalesce(position, 100000)
. (Faites le deuxième nombre plus grand que tous les autresposition
dans la base de données.)la source
la source
Pour une
DATE
colonne, vous pouvez utiliser:NULLS last:
Les blancs durent:
la source
Pour obtenir le résultat suivant:
1, 2, 3, 4, NULL, NULL, NULL.
UTILISER la syntaxe, placer
-(minus sign)
avant le nom du champ et utiliser le type_ordre inverse (comme: si vous voulez commander par ordre ASC, utilisez DESC ou si vous voulez commander DESC, utilisez ASC)SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC
la source
Cela fonctionne bien:
la source
Pourquoi ne commandez-vous pas par NULLS DERNIER?
la source
NULLS LAST
- quelle version de MySQL a été introduite?