如何在T-SQL的order by子句中正确使用Case语句?

时间:2017-11-15 15:42:19

标签: sql sql-server

我在订购条款中使用案例陈述时遇到一些困难,并希望就我未考虑的事项提供一些指导。(SSMS 2017,SS2008 R2 SP3)

鉴于我可以跑:

Select Myname = [name],
        OjectId = [object_id] 
From sys.tables
Order By [name],[object_id]

并且可以运行:

Select Myname = [name],
        OjectId = [object_id] 
From sys.tables
Order By Myname,OjectId

以及:

Declare @Sort as Varchar(25)
Set @Sort = 'Name'
Select Myname = [name],
        OjectId = [object_id] 
From sys.tables
Order By case @Sort
    When 'Name' 
    Then  [name]
    End

我无法理解为什么会失败:

Declare @Sort as Varchar(25)
Set @Sort = 'Name'
Select Myname = [name],
        OjectId = [object_id] 
From sys.tables
Order By case @Sort
    When 'Name' 
    Then  Myname
    End

以及:

Declare @Sort as Varchar(25)
Set @Sort = 'NameObj'
Select Myname = [name],
        OjectId = [object_id] 
From sys.tables
Order By case @Sort
    When 'NameObj' then [name],[object_id]
    End

任何人都可以分享的任何输入都会有所帮助。

1 个答案:

答案 0 :(得分:2)

以下是Microsoft在案例陈述

中定义 Then 关键字的方式

然后

当input_expression等于when_expression求值为TRUE或Boolean_expression求值为TRUE时,返回表达式。结果表达式是任何有效表达式

现在让我们定义表达式?

表达式

是SQL Server数据库引擎评估的符号和运算符组合,以获取单个数据值。简单表达式可以是单个常量,变量,列或标量函数。

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/expressions-transact-sql