SQL多案例陈述

时间:2014-06-22 23:18:53

标签: sql

我怎样才能使这个正确?我收到一个错误说: 关键字' DESC'附近的语法不正确。

SELECT *
FROM Companies
Order By 
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END, 
    CASE @Direction
        WHEN 'DESC' THEN DESC
        WHEN 'ASC' THEN ASC
    END 

我可以不用两个案例陈述吗?如果没有,我如何通过字段和方向作为参数传递订单的名称?

谢谢!

解决了第一个问题之后的另一个问题......

如果我包含一个没有字符串数据类型的字段,则会抛出错误。 例如:

SELECT *
FROM Companies
Order By
  CASE @Direction WHEN 'DESC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
        WHEN 'Score' THEN Score

    END
  END DESC,
  CASE @Direction WHEN 'ASC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
        WHEN 'Score' THEN Score
    END
  END ASC

@OrderByField是nvarchar的类型(50) 假设Score的数据类型为float。

如果我没有尝试按得分字段排序,则上面会抛出类似下面的错误。 将数据类型nvarchar转换为float时出错。

同样,包含createddate会引发错误:从字符串转换日期和/或时间时转换失败。

如果有人能提供帮助,我们将非常感激。

2 个答案:

答案 0 :(得分:2)

您无法从案例陈述中返回关键字。

但是你可以通过两种方式排序来实现你想要的,但是为你不想要的顺序返回一个常量表达式:

SELECT *
FROM Companies
Order By
  CASE @Direction WHEN 'DESC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END
  END DESC,
  CASE @Direction WHEN 'ASC' THEN
    CASE @OrderByField
        WHEN 'CompanyName' THEN CompanyName
        WHEN 'CreatedDate' THEN CreatedDate
    END
  END ASC

不匹配的案例将返回null,因此在订购时会被忽略。

答案 1 :(得分:1)

由于ASCDESC是关键字,因此您无法将其作为CASE的返回值。

您可以提出两种情况,一种针对ASC,另一种针对DESC

SELECT *
FROM Companies
Order By 
  CASE
    WHEN @OrderByField = 'CompanyName' AND @Direction = 'ASC' THEN CompanyName
    WHEN @OrderByField = 'CreatedDate' AND @Direction = 'ASC' THEN CreatedDate
  END ASC,
  CASE
    WHEN @OrderByField = 'CompanyName' AND @Direction = 'DESC' THEN CompanyName
    WHEN @OrderByField = 'CreatedDate' AND @Direction = 'DESC' THEN CreatedDate
  END DESC

请注意,案例中的所有值必须具有相同的数据类型,因此您可能需要一对字符串用于字符串,一对用于日期。