0 votes

trier les données SQL par champ de texte, mais ignorer les champs vides

Voici donc à quoi ressemble le tableau

    --------
   | field1 |
   |========|
   |  1.2   |
   |  1.7   |
   |   -    |
   |   -    |
   |  1.3   |
  • les tirets sont en fait des champs vides

Mon instruction SQL actuelle fait un simple "ORDER BY field1" qui met les vides en haut, mais je veux obtenir les chiffres en haut, et mettre les vides en bas.

EDIT :

Ma commande par code ressemble à ceci :

   'Get the sort requirement as per the requirement
   strSql = strSql & " ORDER BY [RequestType], [Rank], [ADRNo]"

Je veux donc qu'il soit ordonné par requesttype, rank, et ensuite ADRNo. Mais je veux que les valeurs nulles viennent en dernier pour les trois champs. J'ai donc indiqué un seul champ dans ma question initiale, mais je travaille en réalité avec 3.

5voto

potatopeelings Points 864
...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]

2voto

David-W-Fenton Points 16613

Ce ORDER BY peut être plus efficace en termes d'utilisation de l'index :

  ORDER BY IsNull(Field1) DESC, Field1

IsNull() renverra un booléen, -1 s'il est nul et 0 s'il ne l'est pas, de sorte que le tri par ordre décroissant fera que les non-vides seront en haut de la liste. Ensuite, le tri restant utilisera n'importe quel index sur Field1.

1voto

HansUp Points 53234

Voici ce que je pense @potatopeelings a suggéré, appliqué à votre échantillon ORDER BY :

strSql = strSql & " ORDER BY IIf(RequestType Is Null, 1, 0), " & _
    "[RequestType], IIf(Rank Is Null, 1, 0), [Rank], " & _
    "IIf(ADRNo Is Null, 1, 0), [ADRNo]"

Avec une seule colonne, il est simple de forcer les Nulls à trier en dernier avec la technique que @potatoepeelings vous a montrée. Cependant, lorsque vous avez 3 colonnes qui peuvent contenir des Nulls, il n'est pas évident de savoir comment vous voulez les trier.

Si ce n'est pas ce que vous voulez, révisez votre question pour ajouter des colonnes supplémentaires et montrez-nous comment vous voulez les trier.

Modifier : Peut-être que c'est plus proche de ce que vous voulez :

strSql = strSql & " ORDER BY IIf(RequestType Is Null, 1, 0), " & _
    "IIf(Rank Is Null, 1, 0), " & _
    "IIf(ADRNo Is Null, 1, 0), [RequestType], [Rank], [ADRNo]"

Tout dépend de l'ordre dans lequel vous voulez que les Nulls de la deuxième et de la troisième colonne soient classés.

0voto

Denaem Points 176

order by feild1 desc

desc placera les valeurs NULL en dernier dans la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X