有没有办法可以做像
这样的事情@sortType
SELECT
*
FROM
table
ORDER BY
-- if sortType == id
table.Id
-- else if sortType == date
table.Date
那句法怎么样?感谢。
答案 0 :(得分:17)
这里有一个问题......你不能在case语句中混合数据类型,因此你需要为不同的数据类型创建不同的case语句组。
SELECT
*
FROM
table
ORDER BY
CASE WHEN @SortType = id THEN table.Id END ASC,
CASE WHEN @SortType != id THEN table.Date END ASC
相关博文:
http://dirk.net/2006/11/14/dynamic-order-by-with-case-statement-in-sql-server-data-type-issues/
答案 1 :(得分:5)
尝试
ORDER BY
case when @sortType = 'id' then
table.Id
else
table.Date end
警告:这就是说,出于性能原因,最好将其拆分或使用带有sp_executesql的动态sql
答案 2 :(得分:5)
不要做那样的事情。生成的查询计划必须满足两个条件,因为该计划是通用的,并且不依赖于@variables的特定运行时值。这样的计划将错过很多可能的优化。您应该明确地分开查询:
@sortType
if @sortType == id
SELECT
*
FROM
table
ORDER BY
table.Id
else if @sortType == date
SELECT
*
FROM
table
ORDER BY
table.Date
这与尝试实施dynamic search conditions的问题完全相同。在ORDER BY中使用CASE的语法糖实际上是一个查询优化阻止程序。
答案 3 :(得分:0)
或只是将日期转换为整数...
... ORDER BY case
When @sortType = 'id' Then table.Id
Else cast(table.Date As Integer) end