SQL comment faire durer les valeurs NULL lors du sorting croissant

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 sortingés par ordre croissant par le champ datetime, mais je veux des lignes où le champ datetime est null à la fin de la liste, pas au début.

Y a-t-il un moyen simple d’accomplir cela?

    select MyDate from MyTable order by case when MyDate is null then 1 else 0 end, MyDate 

    (Un “peu” en retard, mais cela n’a pas été mentionné du tout)

    Vous n’avez pas spécifié votre SGBD.

    En standard SQL (et les SGBD les plus modernes comme Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB et H2), vous pouvez spécifier NULLS LAST ou NULLS FIRST :

    Utilisez NULLS LAST pour les sortinger jusqu’à la fin:

     select * from some_table order by some_column DESC NULLS LAST 

    Je suis également tombé sur ce sujet et ce qui suit semble faire l’affaire: MySQL et PostgreSQL:

     ORDER BY date IS NULL, date DESC 

    comme trouvé à https://stackoverflow.com/a/7055259/496209

     order by coalesce(date-time-field,large date in future) 

    Vous pouvez utiliser la fonction intégrée pour vérifier la valeur 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;

    Si votre moteur autorise ORDER BY x IS NULL, x ou ORDER BY x NULLS LAST utilisez-le. Mais si ce n’est pas le cas, cela pourrait aider:

    Si vous sortingez par type numérique, vous pouvez le faire: (Emprunter le schéma d’ une autre réponse .)

     SELECT * FROM Employees ORDER BY ISNULL(DepartmentId*0,1), DepartmentId; 

    résultat affiché trié par DepartmentId avec NULL en dernier

    Tout nombre non nul devient 0 et les valeurs nulles deviennent 1, ce qui sortinge les valeurs NULL en dernier.

    Vous pouvez aussi le faire pour les chaînes:

     SELECT * FROM Employees ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName 

    résultat affiché trié par LastName avec NULL en dernier

    Parce que 'a' > '' .

    Cela fonctionne même avec des dates en contraignant à un nullable int et en utilisant la méthode pour ints ci-dessus:

     SELECT * FROM Employees ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate 

    (Permet de faire comme si le schéma avait HireDate.)

    Ces méthodes évitent la nécessité de définir ou de gérer une valeur “maximale” pour chaque type ou de corriger les requêtes si le type de données (et le maximum) change (les deux problèmes rencontrés par les autres solutions ISNULL). De plus, ils sont beaucoup plus courts qu’un CASE.

     SELECT * FROM Employees ORDER BY ISNULL(DepartmentId, 99999); 

    Voir cet article de blog .

    Lorsque votre colonne de commande est numérique (comme un classement), vous pouvez la multiplier par -1, puis ordonner la descente. Il gardera l’ordre que vous êtes en train d’exécuter mais mettre NULL en dernier.

     select * from table order by -rank desc 

    Merci à RedFilter pour avoir fourni une excellente solution au problème de bogue du sorting du champ datetime non valide.

    J’utilise la firebase database SQL Server pour mon projet.

    Changer la valeur null datetime en ‘1’ résout le problème du sorting 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 peut pas être traitée.

    Pour gérer un sorting 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é des valeurs maximales +1 pour int et d’autres types de données pour obtenir le sorting attendu. Cela m’a également donné les résultats requirejs.

    Cependant, il serait toujours idéal d’avoir quelque chose de plus simple dans le moteur de firebase database lui-même qui pourrait faire quelque chose comme:

     Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

    Comme mentionné dans la réponse fournie par a_horse_with_no_name.

    Dans Oracle, vous pouvez utiliser NULLS FIRST ou NULLS LAST : spécifie que les valeurs NULL doivent être renvoyées avant / après les valeurs non NULL:

     ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] } 

    Par exemple:

     ORDER BY date DESC NULLS LAST 

    Réf: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html

     order by -cast([nativeDateModify] as bigint) desc 

    La solution utilisant le “cas” est universelle, mais n’utilise pas les index.

     order by case when MyDate is null then 1 else 0 end, MyDate 

    Dans mon cas, j’avais besoin de performance.

      SELECT smoneCol1,someCol2 FROM someSch.someTab WHERE someCol2 = 2101 and ( someCol1 IS NULL ) UNION SELECT smoneCol1,someCol2 FROM someSch.someTab WHERE someCol2 = 2101 and ( someCol1 IS NOT NULL) 

    Utilisez la fonction NVL

      select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY')) 

    Voici l’alternative de NVL dans les plus célèbres SGBD