сортировка SQL по текстовому полю, но пропуск пустых - PullRequest
1 голос
/ 08 июля 2010

Вот как выглядит таблица

    --------
   | field1 |
   |========|
   |  1.2   |
   |  1.7   |
   |   -    |
   |   -    |
   |  1.3   |
  • черточки на самом деле являются пустыми полями

Мой текущий оператор SQL выполняет простое «ORDER BY field1», котороеставит пустые сверху, но я хочу получить цифры сверху, а пустые внизу.

РЕДАКТИРОВАТЬ:

Мой заказ по коду выглядит так:

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

Итак, я хочу, чтобы он упорядочился по типу запроса, рангу и затем ADRNo.Но я хочу, чтобы нулевые значения были последними для всех трех полей.Итак, я разместил одно поле в своем оригинальном вопросе, но я действительно работаю с 3.

Ответы [ 4 ]

5 голосов
/ 08 июля 2010
...order by iif(field1 is null, 1, 0), field1

Logic

iif (field1 - ноль, 1, 0) создает виртуальный столбец с 1 для всех нулевых значений. так что у вас есть

    -------- -------
   | field1 |       |
   |========|=======| 
   |  1.2   |   0   |
   |  1.7   |   0   |
   |   -    |   1   |
   |   -    |   1   |
   |  1.3   |   0   |

, а затем сортировка этого виртуального столбца ставит числа под нулями.

Несколько столбцов

Если у вас есть несколько столбцов, которые могут иметь нулевые значения, вам потребуется дополнительный вычисляемый столбец для каждого столбца. Что-то вроде

    -------- ------- -------- -------
   | field1 |   s1  | field2 |   s2  |
   |========|=======|========|=======| 
   |   2    |   0   |   -    |   1   |
   |   1    |   0   |   1    |   0   |
   |   -    |   1   |   3    |   0   |
   |   -    |   1   |   -    |   1   |
   |   3    |   0   |   2    |   0   |
    -------- ------- -------- -------

теперь у вас есть 2 варианта.

1. вы можете отсортировать каждое поле с нулем в конце. так

...order by iif(field1 is null, 1, 0), field1, iif(field2 is null, 1, 0), field2

даст вам

    -------- ------- -------- -------
   | field1 | field2 |   s1  |   s2  |
   |========|========|=======|=======|
   |   1    |   1    |   0   |   0   |
   |   2    |   -    |   0   |   1   |
   |   3    |   2    |   0   |   0   |
   |   -    |   3    |   1   |   0   |
   |   -    |   -    |   1   |   1   |
    -------- ------- -------- -------

обратите внимание, что в field2 перед 3 стоит ноль (строка 2), потому что сортировка для field1 (2) переопределяет логику нулевой сортировки (s2) для field2. второй нуль (строка 5) в field2 следует после 3 (строка 5) из-за нашей логики сортировки, специфичной для null для s2.

2. вы можете выбрать все нули в поле2 в конце, перед сортировкой по полю1. тогда ваш код будет ...

...order by iif(field1 is null, 1, 0), iif(field2 is null, 1, 0), field1, field2

, что дает вам

    -------- ------- -------- -------
   | field1 | field2 |   s1  |   s2  |
   |========|========|=======|=======|
   |   1    |   1    |   0   |   0   |
   |   3    |   2    |   0   |   0   |
   |   2    |   -    |   0   |   1   |
   |   -    |   3    |   1   |   0   |
   |   -    |   -    |   1   |   1   |
    -------- ------- -------- -------

Примечание

(Ссылка: рассматриваемый комментарий Тома Гуллена). В этом случае в конце ставятся только нулевые значения (пустые строки или строки с пробелами по-прежнему будут в естественном порядке сортировки)

Опция

Так что .. в вашем случае вы бы использовали либо

...ORDER BY 
            IIF([RequestType] IS NULL, 1, 0), [RequestType], 
            IIF([Rank] IS NULL, 1, 0), [Rank], 
            IIF([ADRNo] IS NULL, 1, 0), [ADRNo]

или

...ORDER BY 
            IIF([RequestType] IS NULL, 1, 0), 
            IIF([Rank] IS NULL, 1, 0), 
            IIF([ADRNo] IS NULL, 1, 0), 
            [RequestType], 
            [Rank], 
            [ADRNo]
3 голосов
/ 09 июля 2010

Этот ORDER BY может быть более эффективным с точки зрения использования индекса:

  ORDER BY IsNull(Field1) DESC, Field1

IsNull () вернет логическое значение, -1 для нулевого значения и 0, если нет, поэтому сортировка по убываниюпорядок приведет к тому, что непустые будут в верхней части списка.Тогда оставшаяся сортировка будет использовать любой индекс на Field1.

1 голос
/ 08 июля 2010

Вот то, что я думаю, что @potatopeelings предложил, примененный к вашему образцу 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]"

С одним столбцом просто заставить Null сортировать в последнюю очередь с помощью методики, которую @potatoepeelings показал вам. Однако, когда у вас есть 3 столбца, которые могут содержать значения Null, не очень понятно, как вы хотите их отсортировать.

Если это не то, что вам нужно, измените свой вопрос, добавив дополнительные столбцы и покажите нам, как вы хотите их отсортировать.

Редактировать : Может быть, это ближе к тому, что вы хотите:

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]"

Все зависит от того, как вы хотите, чтобы нулевые значения во втором и третьем столбцах были упорядочены.

0 голосов
/ 08 июля 2010

заказ по feild1 desc

desc поместит значения NULL последними в списке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...