ORDER BY子句中的T-SQL IF语句

时间:2011-05-10 19:27:06

标签: sql-server tsql sorting

有没有办法可以做像

这样的事情
@sortType

SELECT
    *
FROM
    table
ORDER BY
    -- if sortType == id
    table.Id
    -- else if sortType == date
    table.Date

那句法怎么样?感谢。

4 个答案:

答案 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