Sql Order By ...使用`Case When`进行不同的升序,降序和自定义订单

Nit*_*rpe 12 sql sql-server

我想在某些条件下按折扣对产品进行分类

ORDER BY 
    CASE WHEN @OrderBy = 0
    THEN table.id END ASC,
    CASE WHEN @Orderby = 2
    THEN table.id END ASC,
Run Code Online (Sandbox Code Playgroud)

我想做下面的事情,因为我没有表中的折扣列

CASE WHEN @OrderBy = 4
THEN (100-((table.price/table.oldprice)*100) as discount END ASC
Run Code Online (Sandbox Code Playgroud)

但它会抛出错误 - 我怎么能按折扣排序?

Stu*_*tLC 21

存在相当多的问题,例如,您不能在顺序中为计算字段设置别名,并且您需要转义表名,修复cae和计算括号.

此外,由于您似乎只想CASE在单个变量上,您可以将其@OrderBy移出到CASE的顶部,如下所示:

SELECT * from [table]
ORDER BY 
    CASE @OrderBy
        WHEN  0
            THEN [table].id -- ASC
        WHEN 2
            THEN [table].id * -1 -- DESC
    ---I want to do something like below as I don't have discount column in table
        WHEN 4
            THEN (100-([table].price/[table].oldprice)*100)
    END
Run Code Online (Sandbox Code Playgroud)

SqlFiddle在这里

顺便说一句,如果你需要动态改变ASCDESC列,你可以使用像一个黑客这样通过乘以-1.

(另请注意,ORDER BY CASE ... END ASC, CASE ... END ASC将设置第一个和第二个排序...这似乎没有意义,因为@OrderBy只能有一个值)