...order by iif(field1 is null, 1, 0), field1
Logique
Le iif(field1 is null, 1, 0) construit une colonne virtuelle avec 1 pour toutes les valeurs nulles. vous avez donc
-------- -------
| field1 | |
|========|=======|
| 1.2 | 0 |
| 1.7 | 0 |
| - | 1 |
| - | 1 |
| 1.3 | 0 |
et ensuite le tri de cette colonne virtuelle se charge de mettre les nombres sous les nuls.
Colonnes multiples
Si vous avez plusieurs colonnes qui peuvent avoir des valeurs nulles, vous aurez besoin d'une colonne calculée supplémentaire pour chaque colonne. Quelque chose comme
-------- ------- -------- -------
| field1 | s1 | field2 | s2 |
|========|=======|========|=======|
| 2 | 0 | - | 1 |
| 1 | 0 | 1 | 0 |
| - | 1 | 3 | 0 |
| - | 1 | - | 1 |
| 3 | 0 | 2 | 0 |
-------- ------- -------- -------
maintenant vous avez 2 options.
1.
vous pouvez trier chaque champ avec le null à la fin. donc
...order by iif(field1 is null, 1, 0), field1, iif(field2 is null, 1, 0), field2
vous donnerait
-------- ------- -------- -------
| field1 | field2 | s1 | s2 |
|========|========|=======|=======|
| 1 | 1 | 0 | 0 |
| 2 | - | 0 | 1 |
| 3 | 2 | 0 | 0 |
| - | 3 | 1 | 0 |
| - | - | 1 | 1 |
-------- ------- -------- -------
notez que dans le champ2, il y a un nul (ligne 2) avant 3 parce que le tri pour le champ1 (2) prévaut sur la logique de tri des nuls (s2) pour le champ2. le deuxième nul (ligne 5) dans le champ2 vient après 3 (ligne 5) en raison de notre logique de tri spécifique aux nuls pour s2.
2.
vous pouvez choisir d'avoir toutes les nulles dans le champ2 à la fin, avant de trier sur le champ1. votre code serait alors...
...order by iif(field1 is null, 1, 0), iif(field2 is null, 1, 0), field1, field2
ce qui vous donne
-------- ------- -------- -------
| field1 | field2 | s1 | s2 |
|========|========|=======|=======|
| 1 | 1 | 0 | 0 |
| 3 | 2 | 0 | 0 |
| 2 | - | 0 | 1 |
| - | 3 | 1 | 0 |
| - | - | 1 | 1 |
-------- ------- -------- -------
Note
(Ref : le commentaire de Tom Gullen en question) Cela permet de ne mettre que des nuls à la fin (les chaînes vides, ou les chaînes avec des espaces seront toujours dans l'ordre de tri naturel).
Options
Donc dans votre cas, vous utiliseriez soit
...ORDER BY
IIF([RequestType] IS NULL, 1, 0), [RequestType],
IIF([Rank] IS NULL, 1, 0), [Rank],
IIF([ADRNo] IS NULL, 1, 0), [ADRNo]
o
...ORDER BY
IIF([RequestType] IS NULL, 1, 0),
IIF([Rank] IS NULL, 1, 0),
IIF([ADRNo] IS NULL, 1, 0),
[RequestType],
[Rank],
[ADRNo]