Sql ColumnName作为变量时按大小写排序

Sql ColumnName作为变量时按大小写排序,sql,case,Sql,Case,我见过很多例子,人们在Select语句的orderby子句中使用CASE。通常,他们将变量的值与列名的字符串进行比较 这很好,但是如果你有一张非常宽的桌子呢 你能不能不说这样的话 ORDER BY CASE WHEN @SortDesc = 1 THEN @SortField END DESC, CASE WHEN @SortDesc = 0 THEN @SortField END ASC 或者,对于结果集中的每一列,您真的需要有一个案例吗?编辑:请注意,这正在从SQL字符

我见过很多例子,人们在
Select
语句的
orderby
子句中使用
CASE。通常,他们将变量的值与列名的字符串进行比较

这很好,但是如果你有一张非常宽的桌子呢

你能不能不说这样的话

ORDER BY 
    CASE WHEN @SortDesc = 1 THEN @SortField END DESC,
    CASE WHEN @SortDesc = 0 THEN @SortField END ASC 

或者,对于结果集中的每一列,您真的需要有一个
案例吗?编辑:请注意,这正在从SQL字符串转换为普通的旧SQL,因此动态生成并作为字符串执行它不是一个选项。

您可以为以下内容生成动态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)
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
或者你真的需要有一个案例来证明 结果集?
订购人
当@SortDesc=1时,则@SortField END DESC,
当@SortDesc=0时,则@SortField END ASC

关键是,您所显示的代码不会排序@所有记录上的SortField都被相同的值替换,并且您根本没有特殊订单

您可以做的是寻址一个@orderBy变量,该变量控制realy Ocurr的内容,如下所示:

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)
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

这里您按六个标准排序,但其中五个对于所有记录都为空,因此您的有效顺序是按所选字段排序。是的,您将需要编写所有要使用的变体。

我这样做的原因是因为我将它从sql字符串转换而来。所以,对我来说,这不是一个真正的解决方案。啊,好的。在你的问题中添加细节可能会有帮助。你知道,我总是忘记添加一些相关的内容。谢谢,它被添加了。SortField总是只有一列,所以没关系,我只需要检查它是ASC还是DESC。但是如果你说的是正确的,那么我需要为结果集中的每一列都有一个大小写(这是我想要避免的明显原因)。如果你有数字字段,你可以在子体大小写上乘以-1,但我对性能不太清楚,也没有显示的那样清楚