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