使用'ORDER BY CASE ...'的SQL排序顺序

时间:2015-03-29 18:08:58

标签: sql sql-server sql-order-by

我试图在SQL中创建一个排序函数,但我不能让这个东西工作。我真的试图在Stackoverflow上找到一些类似的问题,但非似乎解决了我的问题。我真的不是这方面的专家,所以希望我的解释是可以理解的。

所以案例如下:我将列出网站上的产品我有链接供用户点击,决定将要排序的内容,ProductName,ProductID等。选择的排序类型是从request.querystring收集的,我使用CreateParameter来避免SQL注入的风险。

这是(简化的)SQL:

"SELECT * FROM Product" & _
"ORDER BY CASE ? " & _
    "WHEN 'ID' THEN ProductID " & _
    "WHEN 'IDART' THEN ArticleNumber " & _
    "ELSE ProductName " & _
"END DESC"    

objConnProdList.CommandType = 1
SET objParam = objConnProdList.CreateParameter("@strOrder", adVarchar, adParamInput, 10,  "%" & request.querystring("OrderBy") & "%")

使用ELSE我将收到错误消息:

  

转换nvarchar值时转换失败' DiningChair'数据类型int。

3 个答案:

答案 0 :(得分:1)

问题是您不能在单个案例中混合使用不同的数据类型。如果将值转换为nvarchars,语法就可以了,但是这不能正确排序。

如果您在示例中使用动态SQL,只需按实际需要添加行即可。如果你有一个存储过程或类似的东西,它可以使用单独的order by子句:

SELECT * FROM Product
ORDER BY 
  CASE @xxx WHEN 'ID' then ProductID end,
  case @xxx WHEN 'IDART' THEN ArticleNumber end,
  ProductName DESC

答案 1 :(得分:0)

我认为你让它变得过于复杂。

var sql = "SELECT * FROM Product";

switch (strOrder)
case when "ID": 
  sql = sql & " ORDER BY ProductID"
  break;
case when "IDART": 
  sql = sql & " ORDER BY ArticleID"
  break;
end;

然后运行它。因为没有你注射的变量,没有注射的地方。

答案 2 :(得分:0)

这是JamesZ答案的变体:

with const as (
      select ? as xxx
     )
SELECT *
FROM const cross join Product
ORDER BY (CASE xxx WHEN 'ID' then ProductID end),
         (case xxx WHEN 'IDART' THEN ArticleNumber end),
         ProductName DESC