sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作。

首先,让我们看一下CASE的语法。在一般的SELECT中,其语法格式如下:

CASE <单值表达式>
WHEN <表达式值> THEN

创建一个用户表
CREATE TABLE user (
id int(10) unsigned NOT NULL auto_increment,
sex tinyint(1) default 1 COMMENT ‘性别:0女;1男;2保密’,
age int(3) default 1 COMMENT ‘年龄’,
province char(254) default NULL COMMENT ‘所在省份’,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

向表中插入测试数据
INSERT INTO user(sex,age,province) VALUES
(‘1’,’22’,’北京’),
(‘0’,’25’,’广东’),
(‘0’,’56’,’天津’),
(‘1’,’14’,’北京’),
(‘0’,’36’,’广东’),
(‘1’,’68’,’湖南’),
(‘1’,’45’,’北京’),
(‘1’,’17’,’河北’),
(‘2’,’33’,’天津’),
(‘1’,’27’,’湖南’),
(‘1’,’29’,’北京’),
(‘2’,’70’,’广东’),
(‘0’,’24’,’北京’)

数据表如下图:
这里写图片描述

实验1.1:将用户性别用文字直观显示

1.简单Case函数写法(注意sex的位置)

select *,(CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘0’ THEN ‘女’ ELSE ‘保密’ END) as sex_text
from user

2.Case搜索函数写法(注意sex的位置【推荐】)

select *,(CASE WHEN sex=’1’ THEN ‘男’ WHEN sex=’0’ THEN ‘女’ ELSE ‘保密’ END) as sex_text
from user
这里写图片描述

总结:简单Case函数写法只适合相等条件判断,不能用于大于、小于及不等于的判断,

Case搜索函数写法适合复杂条件判断:可用于大于、小于及不等于的判断。
实验1.2:将用户性别用文字直观显示:0女;1男;2保密;并按性别显示排序

select *,(CASE WHEN sex=’1’ THEN ‘男’ WHEN sex=’0’ THEN ‘女’ ELSE ‘保密’ END) as sex_text
from user
order by sex_text DESC

总结:用临时生成的字段是可以排序的,MySQL查询流程:先对表数据查询,查出数据后再排序显示。
实验1.3:将用户年龄用文字直观显示(涉及数值范围判断,只能使用“Case搜索函数”写法),如下:

select *,(CASE WHEN age>=60 THEN ‘老年’ WHEN age<60 AND age>=30 THEN ‘中年’ WHEN age<30 AND age>=18 THEN ‘青年’ ELSE ‘未成年’ END) as age_text
from user

实验1.4:综合上面两实验
select *,
(CASE WHEN sex=’1’ THEN ‘男’ WHEN sex=’0’ THEN ‘女’ ELSE ‘保密’ END) as sex_text,
(CASE WHEN age>=60 THEN ‘老年’ WHEN age<60 AND age>=30 THEN ‘中年’ WHEN age<30 AND age>=18 THEN ‘青年’ ELSE ‘未成年’ END) as age_text
from user

实验1.5:将区域分组,统计华北、华南分别的注册人数
select count(*),(CASE province WHEN ‘北京’ THEN ‘华北’ WHEN ‘天津’ THEN ‘华北’ WHEN ‘河北’ THEN ‘华北’ WHEN ‘广东’ THEN ‘华南’ WHEN ‘湖南’ THEN ‘华南’ END) as area
from user
group by area

总结:同样道理,临时生成的字段 area 是可以在查询结束后,用来做排序或分组的。

==========================================================================================

★ 第二部分

创建数据表
CREATE TABLE dj_zt (
id int(10) unsigned NOT NULL auto_increment,
zt char(254) default NULL,
bs char(254) default NULL,
qylx_dm char(254) default NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

插入测试数据
INSERT INTO dj_zt(zt, bs, qylx_dm) VALUES
(‘01’,’a’,’01’),
(‘02’,’b’,’02’),
(‘03’,’c’,’03’),
(‘11’,’d’,’03’),
(‘03’,null,’04’),
(‘07’,’f’,’03’),
(‘12’,’g’,’02’),
(‘07’,’h’,’03’),
(‘11’,’i’,’03’),
(‘07’,’j’,’03’),
(‘11’,’k’,’04’)

实验2.1:查询dj_zt表状态值(zt)为’07’或’11’,当条件为 qylx_dm = ‘03’ 的所有记录数。

A:用CASE语句
select count(CASE a.zt WHEN ‘07’ THEN a.bs END) + count(CASE a.zt WHEN ‘11’ THEN a.bs END) as num
from dj_zt a
where a.qylx_dm = ‘03’

B:不用CASE语句
select count(*)
from dj_zt a
where a.qylx_dm = ‘03’ and a.zt in (‘07’, ‘11’)

结果:A、B两组耗费的代价一样的,相比较B的写法简洁,平局。

实验2.2: 分别查询dj_zt表状态为’07’和’11’且qylx_dm = ‘03’的所有记录数。

A:用CASE语句
select count(CASE a.zt WHEN ‘07’ THEN a.bs END) as num1,count(CASE a.zt WHEN ‘11’ THEN a.bs END) as num2
from dj_zt a
where a.qylx_dm = ‘03’

B:不用CASE语句(写了两条语句,扫描表两遍,效率明显低下)
select count(*)
from dj_zt a
where a.qylx_dm = ‘03’ and a.zt=’07’

select count(*)
from dj_zt a
where a.qylx_dm = ‘03’ and a.zt=’11’

结果:B组代价明显高出A组很多,执行的效率比较低。

总结:CASE 和 IF的区别:
·在高级语言中,CASE的可以用IF来替代,但是在SQL中不行。
·CASE是SQL标准定义的,IF是数据库系统的扩展。
·CASE可以用于SQL语句和SQL存储过程、触发器,IF只能用于存储过程和触发器。
·在SQL过程和触发器中,用IF替代CASE代价都相当的高,相当的麻烦,难以实现。

通过上面几组实例可以看出,应用CASE语句可以让SQL变得简洁高效,从而大大提高了执行效率。而且,CASE的使用一般不会引起性能(相比没有用CASE的语句)低下,反而增加了操作的灵活性

◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆

★ 第三部分 IF语句的用法

▶ IF(expr1,expr2,expr3)

规则:如果 expr1 是TRUE,则返回expr2, 否则返回expr3。

IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

实验3.1:如下:

select *,IF(sex=’1’,’男’,’非男’) as sex_text
from user

总结:IF不像CASE那样可以多条件判断,IF只能判断“真”、“假”;

mysql> SELECT IF(1>2,2,3);
-> 3

mysql> SELECT IF(1<2,’yes ‘,’no’);
-> ‘yes’

mysql> SELECT IF(STRCMP(‘test’,’test1’),’no’,’yes’);
-> ‘no’

如果expr2 或expr3中只有一个明确是 NULL,则IF() 函数的结果类型 为非NULL表达式的结果类型。
expr1 作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值, 那么应该使用比较运算进行检验。

mysql> SELECT IF(0.1,1,0);
-> 0

mysql> SELECT IF(0.1<>0,1,0);
-> 1

在所示的第一个例子中,IF(0.1)的返回值为0,原因是 0.1 被转化为整数值,从而引起一个对 IF(0)的检验。这或许不是你想要的情况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。

▶ IFNULL(expr1,expr2)

规则:假如 expr1 不为 NULL,就返回 expr1,否则返回 expr2。
IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

实验3.2:如果字段bs为空就返回字段zt的值

select *,IFNULL(bs,zt)
from dj_zt
where id in (5,6,12)

实验3.3:如果字段bs为空就返回’ZZX’
select *,IFNULL(bs,’ZZX’)
from dj_zt
where id in (5,6,12)

mysql> SELECT IFNULL(1,0);
-> 1

mysql> SELECT IFNULL(NULL,10);
-> 10

mysql> SELECT IFNULL(1/0,10);
-> 10

mysql> SELECT IFNULL(1/0,’yes’);
-> ‘yes’

IFNULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的情况, 或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:

▶ NULLIF(expr1,expr2)

规则:如果 expr1 = expr2 成立,那么返回值为NULL,否则返回值为 expr1。
这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。

实验3.4:如果字段zt 与 字段qylx_dm有相等的值,就返回空,否则返回zt

select *,NULLIF(zt,qylx_dm)
from dj_zt

mysql> SELECT NULLIF(1,1);
-> NULL

mysql> SELECT NULLIF(1,2);
-> 1

注意,如果参数不相等,则 MySQL 两次求得的值为 expr1

sql语句中的case语句相关推荐

  1. mysql能用case嵌套sql吗,关于sqlserver中查询语句中嵌套case语句使用方法

    ryxxlong的博客 Sql server 中的 CASE 语句文章, 链接 http://ryxxlong.iteye.com/blog/531221 写的比较详细,具体内容如下,主要用于自己以后 ...

  2. sql语句中case_SQL中的CASE语句

    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case sta ...

  3. sql高级语法之case语句

    sql高级语法之case语句 1.创建数据库 2.创建表 3.CASE语句 语法格式1 示例 语法格式2 示例 1.创建数据库 create DATABASE advanced_prac; use a ...

  4. mysql 中 case语句吗_Mysql中的Case语句

    1.Case基本初识 case语句是mysql中的一个条件语句,可以在字段中使用case语句进行复杂的筛选以及构造新的字段.下面通过两个leetcode例子来详细解读case语句的功能: 1.1 Le ...

  5. switch语句中在case块里声明变量会遇到提示“Expected expression before...的问题

    switch语句中在case块里声明变量会遇到提示"Expected expression before..."的问题 例如在如下代码中 1 case constant: 2 in ...

  6. shell脚本中的case语句使用要点

    1.双分号(;;) 用于case语句中一个分支的结束. 可类比C++里面switch...case语句,在case语句之后,若所有语句都输完,后面跟着的"break;". 2.星号 ...

  7. sqlserver中能用when_sqlserver中if语句顶替when.case.语句

    sqlserver中if语句替代when...case..语句 create table Employees ( EmployeeID char(6) primary key not null, Na ...

  8. java break在switch_java中switch case语句需要加入break的原因解析

    java中switch case语句需要加入break的原因解析 java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下 ...

  9. c语言case标号是连续的吗,在switch语句中,case后的标号只能是什么?_后端开发...

    在switch语句中,case后的标号只能是常量表达式.在一个特定的switch语句中,每一个case常量都必须具有举世无双的值,不能够反复.然则switch语句能够包括多个case标签. switc ...

最新文章

  1. Notification和KVO有什么不同
  2. OpenSSH7.0兼容性测试报告
  3. PHP未定义名称的方法,PHP:“调用未定义的方法”......但方法是否已定义?
  4. LVS原理详解及部署之五:LVS+keepalived实现负载均衡高可用
  5. 跳出内层循环 使用 for of 代替 map
  6. 读者专属福利: Git面试宝典分享
  7. Kotlin学习笔记30 补充 作用域函数
  8. 深入解析软件测试行业!它是否存在前景和出路?
  9. 从底层来看函数的调用和返回
  10. ZOJ 1606 Count the Colors (线段数染色)
  11. win7+vs2015+pcl1.8.0配置
  12. MATLAB安装破解教程(内涵所需文件)
  13. 国家2000坐标系的理解
  14. js 获取某一天的前一天时间或者后一天时间
  15. Hadoop学习笔记——入门教程(虚拟机安装LinuxHadoop环境搭建配置)
  16. 功率谱和频谱的区别、联系(自用)
  17. 【历史上的今天】11 月 25 日:P2P 鼻祖 Napster 被收购;机械计算器之父诞生;高春辉的个人网站
  18. ios-deploy 安装与使用
  19. wow盗号木马事件前后
  20. [笔记][总结] MIT线性代数 Gilbert Strang 对称矩阵

热门文章

  1. Windows Terminal美化
  2. 戴尔网吧服务器型号,网吧服务器购买参考 戴尔服务器全分析
  3. android 图片墙拼贴,‎App Store 上的“照片墙 - 照片拼贴拼图”
  4. spark RDD分区2GB限制(Size exceeds Integer.MAX_VALUE)
  5. STM32 CAN通信理解(是半双工还是全双工?)
  6. itext简单实现点击页面预览PDF可下载
  7. Kubernetes1.6新特性-不回收静态POD
  8. 使用 PsPing PaPing 进行TCP端口连通性测试(转载)
  9. 看病要排队 HDU - 1873 题解
  10. multi-mechanize