2013-09-16 2 views
10

Я пытаюсь выбрать из одной таблицы список товаров, заказанных по цене, году, названию и т. Д. Проблема в том, что я должен сделать нулевые значения при последней сортировке по возрастанию ,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 

Я признателен за любую помощь

ответ

2

Вы можете сделать это путем проверки цены заказа дважды:

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 

Кстати, неявное значение выражения случая, когда @orderBy не равно строке, равно null. Когда столбец сортировки содержит все значения NULL, он эффективно отключает сортировку для этого атрибута.

+0

Я попытался запустить ваш код, но я получаю сообщение об ошибке: _Встроенный синтаксис рядом с ключевым словом «ASC'_» в третьей строке. Зачем? – POIR

+0

Я забыл закрыть третье выражение случая с 'END'. Извини за это; Я не тестировал код, прежде чем предлагать его! –

1

Я предложил бы использовать большую фиктивную цена:

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 
+0

К сожалению, моя СУБД, кажется, не поддерживает NULLS LAST. – POIR

+0

Как насчет первого предложения? – Darkzaelus

+0

Да, вы правы. Первое предложение может быть вариантом, но я предпочитаю метод, который я описал первым, потому что, по моему мнению, он более изящный. – POIR

0

Это может показаться ли ke a hack, но вы можете создать новый столбец в наборе результатов «на лету». Как это:

SELECT *, [name of column that may contain zeroes] as foo WHERE /* rest of your code */

Тогда можно сортировать по DESCfoo и ASC на остальных. Просто не забудьте сейчас показать foo пользователю. Также обратите внимание, что да, вы получите тот же столбец в результирующем наборе дважды. Вы также должны использовать CASE, чтобы превратить все ненулевые значения в 1 (или какое-то другое постоянное значение).

1

Вы можете попробовать с этим синтаксисом:

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 
+0

Этот ответ фактически такой же, как [мой] (http: // stackoverflow.ком/а/18832041/+111424). Может быть, это легче читать, потому что он использует псевдоним столбца для описания логики нулевой сортировки. –

1

Я еще не могу добавить свои комментарии. Существует ошибка в коде

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 

Shoud быть как-л

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 
+0

вот и все! Я забыл закрыть выражение дела. спасибо римскому сергеву. Я ценю вашу помощь! – POIR

0

Попробуйте сортировать значение 0 до последнего, когда есть 0,1,2, ... значения в поле. Он принесет 1, 2, ... и 0 в последний заказ.

select * from Product 
order by 
case 
when OrderBy = 0 
    then -1 
else 0 
    end, 
OrderBy desc 

-Chirag

Смежные вопросы