我试图从一张桌子中选择按价格,年份,名称等订购的产品清单.... 问题是我必须在升序排序时使零值最后。
我的代码是:
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
我感谢任何帮助
答案 0 :(得分: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
不等于字符串时,case表达式的隐式值为null。当排序列包含所有空值时,它会有效地禁用对该属性的排序。
答案 1 :(得分:1)
我建议使用大的虚拟价格:
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN 99999999 ELSE A.Price END ASC
或者如果您的DBMS支持NULLS LAST:
ORDER BY CASE WHEN @OrderBy='Price ASC' THEN NULLIF(A.Price,0) END ASC NULLS LAST
答案 2 :(得分: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
答案 3 :(得分: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
要像
一样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
答案 4 :(得分:0)
这可能看起来像是一个黑客,但你可以动态地在结果集上创建一个新列。像这样:
SELECT *, [name of column that may contain zeroes] as foo WHERE /* rest of your code */
然后,您可以在DESC
和foo
上对其余内容进行排序ASC
。请记住现在向用户显示foo
。另请注意,是的,您将在结果集中获得两次相同的列。您还必须使用CASE
将所有非零值转换为1(或其他一些常量值)。
答案 5 :(得分: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