大家对IF ELSE语句可能都很熟悉,它是用来对过程进行控制的。在SQL的世界中CASE语句语句有类似的效果。下面简单的介绍CASE语句的用法。考虑下面的情况,假设有个user表,定义如下:

CREATE TABLE USER   
(   
NAME VARCHAR(20) NOT NULL,---姓名   
SEX INTEGER,---性别(1、男   2、女)   
BIRTHDAY DATE---生日   
);  
CREATE TABLE USER
(
NAME VARCHAR(20) NOT NULL,---姓名
SEX INTEGER,---性别(1、男 2、女)
BIRTHDAY DATE---生日
);

CASE使用场合1:把user表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?我们可以用如下的语句处理:

SELECT    
    NAME,   
    CASE SEX   
        WHEN 1 THEN '男'  
        ELSE '女'  
    END AS SEX,   
    BIRTHDAY   
FROM USER;  
SELECT 
 NAME,
 CASE SEX
  WHEN 1 THEN '男'
  ELSE '女'
 END AS SEX,
 BIRTHDAY
FROM USER;

CASE使用场合2:假设user目前没有值,然后你往user导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?

方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,很麻烦,不是吗?

UPDATE USER SET SEX=3 WHERE SEX=2;   
UPDATE USER SET SEX=1 WHERE SEX=3;   
UPDATE USER SET SEX=2 WHERE SEX=1;  
UPDATE USER SET SEX=3 WHERE SEX=2;
UPDATE USER SET SEX=1 WHERE SEX=3;
UPDATE USER SET SEX=2 WHERE SEX=1;

方法2:使用CASE语句

UPDATE USER SET SEX=   
(   
CASE SEX   
WHEN 1 THEN 2   
WHEN 2 THEN 1   
ELSE SEX   
END   
);  
UPDATE USER SET SEX=
(
CASE SEX
WHEN 1 THEN 2
WHEN 2 THEN 1
ELSE SEX
END
);

细心的朋友可能已经发现了,上面的方法1的三条语句的执行顺序有问题,没错,是我故意那些写的,仅仅是把1变成2,把2变成1就那么麻烦,而且很容易出错,想象一下,如果有很多这样的值需要变换,那是一种什么样的情况。还好,我们有CASE语句,有好多这样的值需要变换,CASE语句也不会存在问题。可能有些朋友还是有疑虑,这样做会不会死循环啊?哈哈,想法很好,如果你发现这样做会死循环,一定要告诉IBM,我反正没发现。

CASE使用场合3:假设让你把张三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,类似这样的更新由很多。该怎么办呢?非常简单,大多数人会这么做。

update USER set BIRTHDAY='1949-10-1' where NAME='张三';   
update USER set BIRTHDAY='1997-7-1' where NAME='李四';  
update USER set BIRTHDAY='1949-10-1' where NAME='张三';
update USER set BIRTHDAY='1997-7-1' where NAME='李四';

当USER表的数据量非常大,而NAME字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用CASE语句,如下:

UPDATE USER SET BIRTHDAY=   
(   
CASE NAME   
WHEN '张三' THEN '1949-10-1'  
WHEN '李四' THEN '1997-7-1'  
ELSE BIRTHDAY   
END   
)   
where NAME in ('张三','李四');  
UPDATE USER SET BIRTHDAY=
(
CASE NAME
WHEN '张三' THEN '1949-10-1'
WHEN '李四' THEN '1997-7-1'
ELSE BIRTHDAY
END
)
where NAME in ('张三','李四');

以上语句只进行一次全表扫描,效率非常高。

---致谢:higny发现了本文的一个错误,在此表示严重感谢

---更多参见:DB2 SQL 精要

----声明:转载请注明出处。

----last update at 2010.5.7

----write by wave at 2009.9.23

----end

http://blog.csdn.net/courageously/article/details/5769757

SQL中的IF ELSE(CASE语句的使用)的更多相关文章

  1. 教您如何使用SQL中的SELECT LIKE like语句

    LIKE语句在SQL有着不可替代的重要作用,下文就将为您介绍SQL语句中SELECT LIKE like的详细用法,希望对您能有所帮助. LIKE语句的语法格式是:select * from 表名 w ...

  2. SQL中SUM函数和CASE WHEN联合使用

    SELECT SUM(case WHEN sex=1 then 1 else 0 end )as '男生', SUM(case when sex =2 then 1 else 0 end )'女生'F ...

  3. SQL中的SELECT_简单查询语句总结

    --以scott用户下的dept和emp表为例 --注意:如果scott用户不能使用,请使用system用户登录--解锁scott用户ALTER USER SCOTT ACCOUNT UNLOCK;- ...

  4. SQL中实现千分位的语句

    传递一个sql的小知识,现成的语句,在工作流的表单域中很实用. 数字或字符串转成千分位 ) 字符串转换成数值 )

  5. SQL中两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  6. MySQL中的if和case语句使用总结

    create table test( id int primary key auto_increment, name ), sex int ) ),(),(),() ,'男','女') from te ...

  7. oracle pl/sql中的循环及if语句

    for循环 /* for循环打印1到10 */ set serveroutput on; declare begin .. loop dbms_output.put_line(i); end loop ...

  8. linq to ef(相当于sql中in的用法)查询语句

    select * from DoctorInfo doctor where doctor.HosDepartId in (select Id from HospitalDepartment hd wh ...

  9. switch case语句中能否作用在String,long上

    在之前的eclipse中使用switch的case语句时是只能为(byte,short,char)int类型或枚举类型.但在jdk1.7以后 在case语句中是可以使用String 以及long 等类 ...

  10. 转载 关于case语句的优先级

    对于这样的组合逻辑电路 always@(X) case(X) X1: X2: …… endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令. (一 ...

随机推荐

  1. Oauth2的遇坑一点提示(Spring Security Oauth2 / Cloud)

    1)使用@EnableOAuth2Sso的网页客户端,登录是成功的可是总是像没成功一样. 提示错误:没有 症结:context-path没设置,或者设置为/(ROOT) 参考资料:https://sp ...

  2. Linux安装ntp同步时间

    1.安装 yum install  ntp 安装下就可以了. 2.寻找一个网络时间服务器,比如一些国家授时中心 微软公司授时主机(美国) time.windows.com 台警大授时中心(台湾) as ...

  3. Sherlock and the Encrypted Data

    题意: 对于16进制数字num,假定 $p_0,p_1,...,p_m$ 在该数字中出现过,如果有 $x = 2^{p_0} + 2^{p_1} + ... + 2^{p_m}$ 且 $x \oplu ...

  4. int和Integer及拆箱与装箱

    int和Integer 如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下In ...

  5. TimeUtils(没试过)

    package util; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.ParseExc ...

  6. 《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”

    思路: 例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移.复杂度O(n^2). 重要思 ...

  7. hdoj2577【多种状态】(简单DP)

    #include <stdio.h> #include <iostream> #include <sstream> #include <string.h> ...

  8. Android DPAD not enabled in AVD

    问题描述:打开Android的仿真器,右侧的按键部分对于上下左右键出现以下现象后果是,这些按键都没法使用,由于我是测试一个小游戏,俄罗斯方块,朋友,要是少了上下左右键,让我情何以堪,而且我试过使用键盘 ...

  9. Educational Codeforces Round 20 C(math)

    題目鏈接: http://codeforces.com/problemset/problem/803/C 題意: 給出兩個數n, k, 將n拆分成k個數的和,要求這k個數是嚴格遞增的,並且這k個數的g ...

  10. [Xcode 实际操作]九、实用进阶-(8)实现App的Setting设置:添加和读取程序的配置信息

    目录:[Swift]Xcode实际操作 本文将演示如何实现添加和读取程序的配置信息. 在项目文件夹[DemoApp]上点击鼠标右键->[New File]创建一个设置束文件 ->[Sett ...