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升序

  显示结果如下:

  

时间: 2024-08-08 22:05:37

T-SQL 基于列的逻辑表达式 (CASE)的相关文章

T_SQL基于列的逻辑表达式(case)

本文摘自:http://www.cnblogs.com/kissdodog/p/3154371.html(感谢作者的分享,总结的很好) 基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用. CASE表达式的作用与编程语言中的IF…THEN…ELSE逻辑类似.只是CASE表达式在T-SQ

SQL Server 列存储索引强化

SQL Server 列存储索引强化 SQL Server 列存储索引强化... 1 1. 概述... 1 2.背景... 2 2.1 索引存储... 2 2.2 缓存和I/O.. 2 2.3 Batch处理方式... 2 3 聚集索引... 3 3.1 提高索引创建... 4 3.2 采样的支持... 4 3.3 BookMark的支持... 4 3.4 其他加强... 4 4 更新处理... 4 4.1 随机插入... 6 4.2 批量插入... 6 4.3 删除和更新... 6 4.4 对

基于Appium的自动化case开发及case分层结构设计

基于Appium的自动化case开发及case分层结构设计 首先为每条case创建一个公共的基类AppiumTestBase,内含setup和teardown两个方法,以后每条case继承该基类即可.代码如下: public class AppiumTestBase { public WebDriverWait webwait; private AndroidDriver driver; @Before public void setUp() throws Exception { File cl

HUABASE :基于列存储的关系型数据库系统

摘要   HUABASE 是基于列存储的关系型数据库系统.列存储技术的特点是数据查询效率高,读磁盘少,存储空间少,是构建数据仓库的理想架构. HUABASE 实现了多种数据压缩机制.查询优化和稀疏索引技术,在支持高效率的商业智能方面具有良好的发展前景,可以帮助企业轻松做出明智的业务经营决策. HUABASE 主页: http://www.huabase.cn/ HUABASE: A Column-Oriented Relational Database System Abstract   HUA

sql与oracle中有关case和decode的用法(行转列)及比较(转

引: 为了举例说明,这里创建了一张成绩表,如下图所示: 比较: 1.sql中,这两个函数我们仅能使用case,代码及结果如下: select name,       case Subject          when '语文' then 1          when '数学' then 2          when '英语' then 3   --else 3       end  as '科目代码'   from Results 同样的,我们可以用case实现行转列,代码及结果如下: s

Sql Server 列转行 Pivot使用

今天正好做 数据展示,用到了列转行,列转行有多种方式,Pivot是其中的一种,Povit 是sql server 2005以后才出现的功能, 下面的业务场景: 每个月,进货渠道的总计数量[Total],有中文,英文年月,等数据列, 原始数据如下: 需求: 需要把数据按每一年的1月到12月展示成一行,如上图,怎么办?Povit排上用场了 有的年,可能不是每个月都有,也就是动态列的生成了. 首先要做的就是构建1到12月, DECLARE @temp NVARCHAR(max)='' SELECT @

基于列转行大表的复杂查询优化

横版流程卡 优化(复杂SQL的优化),留档 一.横版流程卡原SQL 1 SELECT SOL.*,para.* FROM 2 (SELECT 3 A.SERIAL_NUMBER, 4 SUM(casewhen B.spc_item='Speed'and SUBSTR(C.TERMINAL_NAME,1,INSTR(C.TERMINAL_NAME,'-',1,1)-1)='LAS1'then A.SPC_VALUE ELSE 0end)as LAS1_Speed , 5 SUM(casewhen

SQL Server 列存储性能调优(翻译)

原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performance-tuning.aspx SQL Server 的列存储索引是SQL Server 2012 release版本新增的内容,用于提高数据仓库的查询性能,本篇文章阐述列存储的性能调优. 列存储索引性能的基本原则 在相同的硬盘和数据量时,列存储能够明显提高部分查询的速度.致使列存储查询效率高的因素

---oracle 数据库的设计,PL/SQL(loop,for,if,case,while)

1.数据库的设计(DataBase Design): 针对用户特定的需求,然后我们创建出来一个最实用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04.物理机构设计 05.数据库的实施 06.数据库的运行和维护 数据库的3大范式: 1.确保每列的原子性!每一列都是一个不可再分的数据! 2.确保每列都和主键相关! 3.确保每列都和主键有直接的关系,而不是间接依赖(传递依赖)! -----------------------------------