我怎样才能使这个正确?我收到一个错误说: 关键字' 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会引发错误:从字符串转换日期和/或时间时转换失败。
如果有人能提供帮助,我们将非常感激。
答案 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)
由于ASC
和DESC
是关键字,因此您无法将其作为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
请注意,案例中的所有值必须具有相同的数据类型,因此您可能需要一对字符串用于字符串,一对用于日期。