0 приходит при сортировке по возрастанию
Я пытаюсь выбрать из одной таблицы список товаров, заказанных по цене, году, названию и другим....
Проблема в том, что я должен сделать нулевые значения последними при сортировке по возрастанию.
Мой код:
SELECT * FROM Product P
ORDER BY CASE WHEN @OrderBy='Date ASC' THEN Date END ASC,
CASE WHEN @OrderBy='Price ASC' THEN Price END ASC,
CASE WHEN @OrderBy='Title ASC' THEN Title END ASC,
CASE WHEN @OrderBy='' THEN Match END
Это работает, но не ставьте нуль в нижней части списка.
Итак, я попытался преобразовать его (см. Следующий код), но он дал мне ошибку Неправильный синтаксис рядом с ','.
SELECT * FROM Product P
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN
(case A.Price WHEN 0 THEN 1 ELSE 0 END,A.Price )
END ASC
Я ценю любую помощь
Ответы
Ответ 1
Вы можете сделать это, дважды тестируя ценовое упорядочение:
SELECT * FROM Product P
ORDER BY CASE WHEN @OrderBy='Date ASC' THEN Date END ASC,
CASE WHEN @OrderBy='Price ASC' THEN CASE WHEN Price = 0 THEN 1 ELSE 0 END ASC,
CASE WHEN @OrderBy='Price ASC' THEN Price END ASC,
CASE WHEN @OrderBy='Title ASC' THEN Title END ASC,
CASE WHEN @OrderBy='' THEN Match END
Кстати, неявное значение выражения case, когда @orderBy
не равно строке, равно null. Когда столбец сортировки содержит все значения NULL, он эффективно отключает сортировку для этого атрибута.
Ответ 2
Я бы предложил использовать большую фиктивную цену:
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN 99999999 ELSE A.Price END ASC
или если ваша СУБД поддерживает NULLS LAST:
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN NULLIF(A.Price,0) END ASC NULLS LAST
Ответ 3
Вы можете попробовать с этим синтаксисом:
SELECT *,
CASE WHEN @OrderBy = 'Price ASC' AND Price = 0 THEN 1 ELSE 0 END AS OrderPriceZeroLast
FROM Product P
ORDER BY OrderPriceZeroLast,
CASE WHEN @OrderBy = 'Date ASC' THEN Date END ASC,
CASE WHEN @OrderBy = 'Price ASC' THEN Price END ASC,
CASE WHEN @OrderBy = 'Title ASC' THEN Title END ASC,
CASE WHEN @OrderBy = '' THEN Match END
Ответ 4
Я еще не могу добавлять комментарии. В вашем коде есть ошибка.
SELECT * FROM Product P
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN
(case A.Price WHEN 0 THEN 1 ELSE 0 END,A.Price )
END ASC
Слушать так, как
SELECT *
FROM Product P
ORDER BY
CASE
WHEN @OrderBy='Price ASC'
THEN
CASE A.Price
WHEN 0
THEN 1
ELSE 0
END
END,
A.Price
Ответ 5
Это может показаться хаком, но вы можете создать новый столбец в наборе результатов "на лету". Вот так:
SELECT *, [name of column that may contain zeroes] as foo WHERE /* rest of your code */
Затем вы можете сортировать DESC
на foo
и ASC
на остальных. Просто не забудьте теперь показать foo
пользователю. Также обратите внимание, что да, вы получите тот же столбец в результирующем наборе дважды. Вы также должны использовать CASE
, чтобы превратить все ненулевые значения в 1 (или некоторое другое постоянное значение).
Ответ 6
Попробуйте это, чтобы сортировать значение 0 до последнего, когда в поле находятся значения 0,1,2,....
Это принесет 1, 2,... и 0 в последний заказ.
select * from Product
order by
case
when OrderBy = 0
then -1
else 0
end,
OrderBy desc
-Chirag