Можно ли использовать как порядок, так и где в одном запросе - PullRequest
5 голосов
/ 17 июля 2009

Я создал таблицу. В одной области у меня есть приоритет этой записи (между 1-9). Я не установил приоритет для всех записей, поэтому для некоторых записей он останется нулевым.

При отображении этих записей на моей HTML-странице я просто проверяю эти приоритеты - если приоритет существует, то я буду отображать его как есть, если он нулевой, тогда я буду отображать его как самый низкий приоритет из '10' только для показа).

Проблема возникает при сортировке таблицы. Если я попытаюсь sort(DESC) таблицы, она отобразит 10 в первом ряду, а затем отлично продолжится (1,2, ....).

Как это решить?

Можно ли сначала отобразить приоритеты, а затем продолжить с нулевыми значениями?

Ответы [ 3 ]

4 голосов
/ 17 июля 2009

Вот краткий пример, который показывает, как преобразовать NULL в значение и затем отсортировать по нему ..

create table test
(
    priority int null,
    detail varchar(10)
)

insert into test values (1, 'one')
insert into test values (3, 'three')
insert into test values (8, 'eight')
insert into test values (9, 'nine')
insert into test values (null, 'ten')

select ISNULL(priority, 10), detail from test order by ISNULL(priority, 10)

Ключ ISNULL - поле null'able для преобразования значений NULL в требуемое значение (10).

2 голосов
/ 17 июля 2009

Есть несколько способов ее решить.

1 / Измените данные таким образом, чтобы на самом деле в таблице было 10 (а не NULL):

update table TBL set FLD = 10 where FLD is null;

2 / Измените ваш запрос, чтобы он возвращал различные значения для NULL:

select FLD1, FLD2, case where FLD3 is null then 10 else FLD3 end from ...

3 / Создайте представление для автоматического выполнения описанного выше варианта 2.

Я бы предпочел перейти к варианту 1, поскольку он, вероятно, будет наиболее эффективным.

SQL не определяет порядок сортировки значений NULL (хотя я думаю, что они указывают, что они должны быть смежными) - это означает, что они могут быть в начале или в конце (или, возможно, в середине, хотя я никогда не видел, чтобы это произошло).

Причина, по которой я поднимаю аспект эффективности, заключается в том, что функции для отдельных строк плохо масштабируются. По мере увеличения таблицы вы обнаружите, что преобразование значений NULL в 10 при каждом выборе будет очень дорогим.

Гораздо лучше кусать пули и просто установить их в 10 в базе данных. Это позволит СУБД лучше оптимизировать запросы. И, если вам когда-либо понадобится использовать 10 для другого реального уровня приоритета, просто измените все текущие 10 с на 11 с (или 9999 с) перед началом.

1 голос
/ 17 июля 2009

Если вы хотите, чтобы записи с приоритетом NULL появлялись последними, я бы порекомендовал что-то вроде

ORDER BY (IFNULL (Priority, 1000000)) или что-то в этом роде

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