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-SQL中并不能控制T-SQL程序的流程,只是作为基于列的逻辑使用。

第一种简单的用法:

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

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

CASE简单表达式(CASE Simple Expression):将某个表达式与一组简单表达式进行比较以确定结果。

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

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

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

CASE 搜索表达式(CASE Searched Expression):计算一组布尔表达式以确定结果。

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

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

  多个列组合判断:

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

  

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

  

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-10-11 18:14:29

T_SQL基于列的逻辑表达式(case)的相关文章

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程序的流程,只是作为基于列的逻辑使用. 一个简单的示例,假设有这样一张表: 在查询的时候,对于列S

基于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的优化),留档 一.横版流程卡原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

MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行:利用max(case when then) SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CASE WHEN course='数学' THEN score END ) AS 数学, MAX( CASE WHEN course='英语' THEN score END ) AS 英语 FROM student GROUP BY `name` ; 合并字段显示:利用group_cancat(cour

疑难杂症 - SQL语句整理

一.关联子查询-查日期最新列 前天在工作中遇到一条非常有用的SQL语句,想了好久愣是没搞出来.今天将这个问题模拟出来:先看表 需求是,对于每个人,仅显示时间最新的那一条记录. 答案如下: select * from record as a where not exists (select null from record as b where a.Name = b.Name and a.CreateTime < b.CreateTime) 结果如下: 这个问题的关键难点在于,既要去除重复,又要显

sql语句进阶教程(学习sql这一篇就够了)

最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的一种标准的计算机语言. 1.1 SQL语言主要有3个主要的组成部分. DML(Data Manipulation Language)数据操纵语言.这个模块可以让我们检索.修改.增加.删除数据库中的

SqlDataReader 会将case...when 查询的数据列设置为只读

第一次写博,想分享一下解决的问题... 在处理一个问题时发现,SqlDataReader 在执行有case...when..语句的Sql时都会将该列设置为只读属性 虽然不知道具体的原因是什么,但是感觉很有意思. 如"SELECT TOP 1 CASE sex WHEN 0 THEN '男' ELSE '女' END        AS sex1,sex FROM student " 从学生表里面查询性别列,一个使用case ...when ,一列之间查询,在使用SqlDataReade

Oracle数据库row_number() over统计前15名企业, wm_concat(case when then)行转列

1. ROW_NUMBER() OVER函数的基本用法 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 例如:row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的) 如:不同的产品类别和计量单位下,查询所有企业的排名. SELECT product_type 产品