排序升序时0到最后

时间:2013-09-16 14:13:01

标签: sql sorting select sql-order-by

我试图从一张桌子中选择按价格,年份,名称等订购的产品清单.... 问题是我必须在升序排序时使零值最后。

我的代码是:

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

我感谢任何帮助

6 个答案:

答案 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 */

然后,您可以在DESCfoo上对其余内容进行排序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