10

我试图从一个表中选择按价格、年份、名称和其他排序的产品列表......问题是我必须在升序排序时将零值排在最后。

我的代码是:

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

这可行,但不要将零放在列表的底部。因此,我尝试对其进行转换(请参阅下一个代码),但它给了我错误Incorrect syntax near ','

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

我很感激任何帮助

4

6 回答 6

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

顺便说一句,case 表达式的隐含值 when @orderBydoesn't equal the string 是 null。当排序列包含所有空值时,它会有效地禁用该属性的排序。

于 2013-09-16T15:41:19.623 回答
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
于 2013-09-16T14:18:13.463 回答
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 
于 2013-09-16T16:20:10.710 回答
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
于 2013-09-16T15:30:49.313 回答
0

这可能看起来像一个 hack,但您可以在结果集上动态创建一个新列。像这样:

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

然后你可以DESC对其余的进行排序。请记住现在向用户显示。另请注意,是的,您将在结果集中两次获得相同的列。您还必须使用 a将所有非零值转换为 1(或其他一些常量值)。fooASCfooCASE

于 2013-09-16T14:18:25.973 回答
0

当字段中有 0,1,2,... 值时,尝试将 0 值排序到最后。它将 1, 2,... 和 0 带到最后一个订单。

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

-奇拉格

于 2017-10-04T12:02:11.443 回答