zoukankan      html  css  js  c++  java
  • SQL中的IF ELSE(CASE语句的使用)(转载)

    大家对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 ('张三','李四');

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

  • 相关阅读:
    GRUB2 分析 (三)
    GRUB2 分析 (二)
    快速填充像素的方法
    GRUB2 分析 (一)
    自制Linux映像和发行版Robomind
    为MarS Board安装无线网卡Linux驱动
    alsa音频播放过程中的基本概念
    常见Soc平台图形内存管理学习笔记
    snprintf笔记
    linux命令行配置wifi连接并通过ssh代理开启socks代理
  • 原文地址:https://www.cnblogs.com/haw2106/p/6483331.html
Copyright © 2011-2022 走看看