web-dev-qa-db-fra.com

TSQL ORDER BY avec null ou premier ou dernier (en bas ou en haut)

J'ai une colonne de date qui a un NULL. Je veux commander par la colonne de date ASC, mais j'ai besoin que les NULL soient en bas. Comment le faire sur TSQL ?

20

En SQL standard, vous pouvez spécifier où placer les valeurs nulles:

order by col asc nulls first
order by col asc nulls last
order by col desc nulls first
order by col desc nulls last

mais T-SQL ne respecte pas la norme ici. L'ordre des valeurs NULL varie selon que vous triez par ordre croissant ou décroissant dans T-SQL:

order by col asc -- implies nulls first
order by col desc -- implies nulls last

Avec des entiers, vous pouvez simplement trier par les négatifs:

order by -col asc -- sorts by +col desc, implies nulls first
order by -col desc -- sorts by +col asc, implies nulls last

Mais ce n'est pas possible avec des dates (ou des chaînes d'ailleurs), vous devez donc d'abord trier par est nul/n'est pas nul et seulement ensuite par votre colonne:

order by case when col is null then 1 else 2 end, col asc|desc -- i.e. nulls first
order by case when col is null then 2 else 1 end, col asc|desc -- i.e. nulls last
44
Thorsten Kettner
Select *
 From  YourTable
 Order By case when DateCol is null then 0 else 1 end
         ,DateCol

Ou même Order By IsNull(DateCol,'2525-12-31')

8
John Cappelletti

order by case when col_name is null then 1 else 2 end, col_name asc a fait l'affaire sur Oracle. Cependant, la même chose sur MS SQL Server pousse les enregistrements NULL vers le bas en laissant non null au sommet du jeu de résultats.

1
Tez Kurmala