Sql 基于列的Case表达式

Case表达式可以用在 Select,update ,delete ,set,in,where ,order by,having子句之后,

只是case表达式不能控制sql程序的流程,只能作为基于列的逻辑使用

SELECT  TOP 4 CASE    a.Id 
        WHEN 1 THEN '骨性关节炎1'
        WHEN 2 THEN '骨性关节炎2'
        WHEN 3 THEN '骨性关节炎3'
        ELSE '不知道'
        END AS MyName
 FROM [dbo].[Disease] a 
ORDER BY a.Id 

也可以这样写:

SELECT  TOP 4  MyName = CASE    a.Id 
        WHEN 1 THEN '骨性关节炎1'
        WHEN 2 THEN '骨性关节炎2'
        WHEN 3 THEN '骨性关节炎3'
        ELSE '不知道'
        END 
 FROM [dbo].[Disease] a 
ORDER BY a.Id 

 

case表达式分两种:
简单表达式:将某个表达式与一组简单表达式进行比较以确定结果
即:整个表达式只会取一列的值做相应的判断,
搜索表达式:计算一组布尔表达式以确定结果

上面的实例就是一个简单表达式

注意:then 后面的数据类型必须相同或者兼容,否则会报错

case搜索表达式:

 SELECT  CASE 
          WHEN r.[SystemName] = 'Administrators' THEN '管理员'
          WHEN r.[SystemName] = 'Registered' THEN 'APP注册用户'
          ELSE '不知道'
          END AS MyName
  
   FROM [dbo].[Role] r

注意顺序:当第一个when后的表达式为true,则取第一个then后面的值,即使第二个when表达式也为true

CASE表达式在ORDER BY中的使用:
case表达式在order by 中可以将排序结果分类,使符合某些条件的行采用一种排序方式,符合另外另一种条件的行采用另一种排序方式

 DECLARE @beforeTime DATETIME
      SET  @beforeTime = DATEADD(MONTH,-1,GETDATE())  
      SELECT * FROM #result r  ORDER BY  
                               CASE WHEN  r.CreatedOnUtc >= @beforeTime THEN r.HotCount END DESC ,
                               CASE WHEN  r.CreatedOnUtc < @beforeTime THEN r.CreatedOnUtc END DESC

注意:这里每一条规则都要单独写一个case表达式,因为case表达式是基于列的,一个case表达式只能返回一个值,所以基于多少个值排序,就需要多少个case表达式

 

posted @ 2016-07-26 11:18  那就让我这样吧  阅读(1344)  评论(0编辑  收藏  举报