zoukankan      html  css  js  c++  java
  • T-SQL 基于列的逻辑表达式 (CASE)

    CASE简介

      基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后。由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用。

      CASE表达式的作用与编程语言中的IF…THEN…ELSE逻辑类似。只是CASE表达式在T-SQL中并不能控制T-SQL程序的流程,只是作为基于列的逻辑使用。

      一个简单的示例,假设有这样一张表:

      

      在查询的时候,对于列Sex,如果是False就显示男,如果是True就显示女。

      语句如下:

      SELECT Id,Name,
          CASE Sex 
          WHEN 0 THEN ''
          WHEN 1 THEN '' 
          ELSE '不清楚' 
          END AS 性别
      FROM PERSON

      显示结果如下:

      

           CASE表达式实际情况可以分为两种:

    •        CASE简单表达式(CASE Simple Expression):将某个表达式与一组简单表达式进行比较以确定结果。
    •        CASE 搜索表达式(CASE Searched Expression):计算一组布尔表达式以确定结果。

      下面分别介绍这两种方式。

    CASE简单表达式

      在CASE简单表达式中,整个表达式只会取一列的值做相应的判断。就如同上面的例子一样,现在只给出另外一种等价的写法。

    SELECT Id,Name,
        性别 = CASE Sex     --区别仅仅是将别名放到这里而已
        WHEN 0 THEN ''
        WHEN 1 THEN '' 
        ELSE '不清楚' 
        END
    FROM PERSON

      因为CASE表达式的值只局限在一列当中,所以THEN后面的值数据类型必须相同,或者兼容,否则就会报错。

      在上面语句中,还有一个可选的“ELSE”语句,这个语句可以省略,但最好的做法是保留ELSE,否则不在匹配值范围内的所有值都会为“NULL”。

    CASE搜索表达式

       与CASE简单表达式不同,CASE搜索表达式提供了更强大的功能,CASE搜索表达式不仅可以使用更复杂的逻辑表达式,而且还能够根据多个列的数据确定所显示列的值。

      那么如何根据列来确定显示值呢,且看下面例子:

    SELECT Id,Name,
        性别 = CASE            --注意这里的CASE后面不跟任何东西了
        WHEN Sex=0 THEN '帅哥'      --当然Sex你可以换成任意其他列
        WHEN Sex=1 THEN '美女'
        ELSE '不清楚' 
        END
    FROM PERSON

      显示结果如下:

      

      现在来做一个根据多个列判断显示的例子,在原来的表上添加两条记录

      

      多个列组合判断:

      现在要根据Id和Sex两个列来组合判断帅哥,美女的SQL如下:

    SELECT Id,Name,
        CASE
        WHEN Id = 3 AND Sex = 0 THEN '帅哥'  --这里要注意顺序,优先显示前面匹配到的,这个后面会提到
        WHEN Id = 4 And Sex = 1 THEN '美女' 
        WHEN Sex = 0 THEN ''
        WHEN Sex = 1 THEN ''
        ELSE '不清楚'
        END AS 性别
    FROM Person

      显示结果如下:

      

      范围判断:

      再新建一个表如下所示:

      

      这里要实现的效果是,当分数大于90,显示优秀,大于80,显示良好...

      SQL语句如下:

      SELECT Id,Name,
      CASE 
      WHEN Score > 90 THEN '优秀'
      WHEN Score > 80 THEN '良好'
      WHEN Score > 70 THEN '中等'
      WHEN Score > 60 THEN '及格'
      ELSE '不及格'
      END AS 分数
      FROM Score

      查询结果如下:

      

      这里要注意WHEN…THEN是以先后顺序出现,当第一个WHEN后面的表达式为FALSE时,则会去看第二个WHEN后的表达式,依次类推。当第一个WHEN后的表达式为TRUE时,则取第一个THEN后面的值,即使第二个WHEN表达式也为TRUE。所以这里为什么刘备分数满足前面几个条件,也显示第一个结果。

    CASE表达式在ORDER BY中的使用

      CASE表达式在ORDER BY中可以将排序结果分类,可以使符合一定条件则升序,符合另外一定条件则降序,但总体差不多,下面给个例子。

      还是刚才那张表,我想,当性别为男则Id降序排序,如果性别为女则Id升序排序。SQL语句如下:

      SELECT Id,Name,Sex
      FROM Person
      ORDER BY 
          CASE WHEN Sex=0 THEN Id END DESC,    --性别为男,Id降序
          CASE WHEN Sex=1 THEN Id END ASC      --性别为女,Id升序

      显示结果如下:

      

  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3154371.html
Copyright © 2011-2022 走看看