我见过很多人在CASE WHEN
语句的ORDER BY
子句中使用Select
的例子。通常,他们将变量的值与列名的字符串进行比较。
这很好但是当你有一个非常宽的桌子时呢?
你能不能说出像
这样的话ORDER BY
CASE WHEN @SortDesc = 1 THEN @SortField END DESC,
CASE WHEN @SortDesc = 0 THEN @SortField END ASC
或者,您真的必须在结果集中为每个列添加CASE WHEN
吗?编辑:请注意,这是从SQL字符串转换为普通的旧SQL,因此动态构建并将其作为字符串执行不是一种选择。
答案 0 :(得分:0)
您可以为此类建立动态sql字符串:
DECLARE @SortDesc varchar(max)
SELECT @SortDesc = [query to get your Sort column name].
DECLARE @sql varchar(max) = 'SELECT * FROM TABLE ORDER BY ' + @SortDesc
exec(@sql)
答案 1 :(得分:0)
或者你真的必须为每一列提供一个CASE WHEN 结果集?
订购单 @SortDesc = 1时的情况@SortField END DESC,
情况@SortDesc = 0那么@SortField END ASC
重点是您显示的代码不会有订单。 @SortField在所有记录上被替换为相同的值,并且您根本没有特殊订单。
你可以做的是解决一个@orderBy变量,控制像这样的真正的事情:
ORDER BY
CASE WHEN @orderBy = 'NameDesc' THEN name END DESC,
CASE WHEN @orderBy = 'NameAsc' THEN name END,
CASE WHEN @orderBy = 'someDateDesc' THEN someDate END DESC,
CASE WHEN @orderBy = 'someDateAsc' THEN someDate END,
CASE WHEN @orderBy = 'IdDesc' THEN Id END DESC,
CASE WHEN @orderBy = 'IdAsc' THEN Id END
在这里,您按六个标准进行排序,但其中五个标准对所有记录都是空的,因此您的排序顺序是所选字段。是的,您需要编写您想要使用的所有变体。