J'ai une table SQL avec un champ datetime. Le champ en question peut être nul. J'ai une requête et je veux que les résultats soient triés dans l'ordre croissant par le champ datetime, mais je veux des lignes où le champ datetime est nul à la fin de la liste, pas au début.
Existe-t-il un moyen simple d'accomplir cela?
sql
sorting
sql-order-by
David Božjak
la source
la source
Réponses:
la source
order by case when MyDate is null then 1 else 0 end
est une très longue façon de direORDER BY MyDate IS NULL
order by 0
est interprété comme un index de colonne et les index de colonne sont basés sur 1. Pour trier une requête par la 3ème colonne, vous pouvez direorder by 3
(ce qui est une idée terrible pour les requêtes de production), mais très pratique (tel quel*
) lors de l'expérimentation.(Un "peu" en retard, mais cela n'a pas du tout été mentionné)
Vous n'avez pas spécifié votre SGBD.
En SQL standard (et dans les SGBD les plus modernes comme Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB et H2), vous pouvez spécifier
NULLS LAST
ouNULLS FIRST
:Utilisez
NULLS LAST
pour les trier jusqu'à la fin:la source
NULLS FIRST
etNULLS LAST
ont été ajoutés dans SQL: 2003 mais aucune implémentation standard n'est disponible dans les différents DMBS. Selon le moteur de base de données, utilisezORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) ouORDER BY ISNULL(some_column), some_column ASC
(MySQL avec une implémentation ISNULL () différente).ASC
/DESC
avec des nulls certains le font. La seule façon de garantir cela est donc d'utiliserNULL FIRST/LAST
si le SGBD le prend en charge. À elle documente ce que vous avez l'intention. L'utilisation deisnull()
ou d'autres fonctions est une solution de contournement pour le support manquant deNULLS FIRST/LAST
(qui est pris en charge par Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB et H2)expr
mot - clé lors de l'utilisation de NULLS FIRST / LAST. Et merci pour les valeurs nulles affichées en premier / dernier variant d'un type de base de données à l'autre, je ne le savais pas!NULLS LAST
n'ai pas fonctionné dans ma base de données MySQL.Je suis également tombé sur cela et ce qui suit semble faire l'affaire pour moi, sur MySQL et PostgreSQL:
comme trouvé à https://stackoverflow.com/a/7055259/496209
la source
IS NULL
etIS NOT NULL
n'ai pas fonctionné dans ma base de données MySQL.la source
Vous pouvez utiliser la fonction intégrée pour vérifier null ou non null, comme ci-dessous. Je le teste et son bon fonctionnement.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
la source
ISNULL(MyDate) DESC, MyDate ASC
, mais cela n'a pas été trié dans le bon ordre.Si votre moteur le permet
ORDER BY x IS NULL, x
ou l'ORDER BY x NULLS LAST
utilise. Mais si ce n'est pas le cas, cela pourrait aider:Si vous triez par type numérique, vous pouvez le faire: (Emprunter le schéma d' une autre réponse .)
Tout nombre non nul devient 0 et les valeurs nulles deviennent 1, ce qui trie les valeurs nulles en dernier.
Vous pouvez également le faire pour les chaînes:
Parce que
'a'
>''
.Cela fonctionne même avec les dates en contraignant à un entier nullable et en utilisant la méthode pour les entiers ci-dessus:
(Supposons que le schéma a HireDate.)
Ces méthodes évitent d'avoir à trouver ou à gérer une valeur "maximale" de chaque type ou à corriger les requêtes si le type de données (et le maximum) change (deux problèmes dont souffrent les autres solutions ISNULL). De plus, ils sont beaucoup plus courts qu'un CASE.
la source
Lorsque votre colonne d'ordre est numérique (comme un rang), vous pouvez la multiplier par -1, puis l'ordre décroissant. Il gardera l'ordre que vous attendez mais mettra NULL en dernier.
la source
Voir cet article de blog .
la source
Merci à RedFilter d'avoir fourni une excellente solution au problème de bogue du tri du champ datetime nullable.
J'utilise la base de données SQL Server pour mon projet.
La modification de la valeur nulle de datetime à «1» résout le problème du tri pour la colonne de type de données datetime. Cependant, si nous avons une colonne avec un type de données autre que datetime, elle ne parvient pas à être gérée.
Pour gérer un tri de colonne varchar, j'ai essayé d'utiliser 'ZZZZZZZ' car je savais que la colonne n'avait pas de valeurs commençant par 'Z'. Cela a fonctionné comme prévu.
Sur les mêmes lignes, j'ai utilisé les valeurs maximales +1 pour les types de données int et autres pour obtenir le tri comme prévu. Cela m'a également donné les résultats requis.
Cependant, il serait toujours idéal d'obtenir quelque chose de plus facile dans le moteur de base de données lui-même qui pourrait faire quelque chose comme:
Comme mentionné dans la réponse fournie par a_horse_with_no_name.
la source
Dans Oracle, vous pouvez utiliser
NULLS FIRST
ouNULLS LAST
: spécifie que les valeurs NULL doivent être renvoyées avant / après les valeurs non NULL:Par exemple:
Réf: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
la source
Si vous utilisez MariaDB, ils mentionnent les éléments suivants dans la documentation des valeurs NULL .
Ce qui précède montre deux façons de classer par valeurs NULL, vous pouvez également les combiner avec les mots-clés ASC et DESC. Par exemple, l'autre façon d'obtenir d'abord les valeurs NULL serait:
la source
La solution utilisant le "cas" est universelle, mais n'utilisez pas les index.
Dans mon cas, j'avais besoin de performances.
la source
UNION ALL
.UTILISER la fonction NVL
Voici l'alternative de NVL dans les SGBD les plus célèbres
la source
la source