SQL --- Case when 的使用方法

1. Case具备两种格式。简单Case函数和Case搜索函数。数据库

--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其余' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其余' END

以下:oracle

select case when t.a = '2' then '是1' else '不是1' end A from AAA tdom

-------------------------------------------------------------------------------------------------------------------函数

 

  1. 1、DECODE ( )ui

    语法:decode(expr,search1,result1,lua

                                  search2,result2,code

                                  ……blog

                                  search n,result n, default)ci

    解释:decode函数将expr值与各search值一个一个比对,若expr值等于search值oracle数据库返回其对应的result值;若没有匹配的search值,则返回default值;若函数中default值缺省则返回null。get

    说明:

        1. search, result 和 default 值能够使表达式。oracle数据库使用short-circuit evaluation,简单点说就是按顺序先计算了search1的值跟expr比较,若不行则继续对search2执行同样的操做,一旦找到匹配的search值,则再也不对后面的search值进行计算比对。

        2. 在比较以前,oracle自动将expr和每个search值的数据类型转换成第一个search值的数据类型。同理也把全部result值的数据类型转换成第一个result值的数据类型。若第一个result值的数据类型为CHAR或第一个result值缺省,那么oracle就令返回值的数据类型为VARCHAR2。

         3.在decode函数中,oracle默认两个null值是相等的,若expr为null,则oracle返回search1的result为null。

         4.decode函数中包括expr,search , result 和 default 值在内,最多可包含255个参数。

    实例:

    SELECT product_id,

    DECODE (warehouse_id, 1, 'Southlake',

                          2, 'San Francisco', 

                          3, 'New Jersey', 

                          4, 'Seattle', 'Non domestic') "Location" 

    FROM inventories 

    WHERE product_id < 1775 

    ORDER BY product_id, "Location"; 

    延伸用法: 

    1. 与sign函数联用比较大小:

    语法:select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1与arg2的较小值  

    实例:select decode(sign(3-5),1 ,3, 5) from dual   

     注:sign()函数根据某个值是0、正数仍是负数,分别返回0、一、-1

    2. 表、视图结构转化:

    基本思路:

    使用substrb函数实现对字段的判断,而后用decode函数对数据进行从新计算,并生成新的数据和构成新的表(table or view)。 

  2.  

    2、CASE WHEN

    语法:

    SELECT     CASE           

                WHEN price IS NULL THEN 'Unpriced'           

                 WHEN price < 10 THEN 'Bargain'           

                 WHEN price BETWEEN 10 and 20 THEN 'Average'           

                 ELSE 'Gift to impress relatives'       

                END AS "Range",       

                Title   

     FROM titles   

     where   

         CASE           

                     WHEN price IS NULL THEN 'Unpriced'           

                     WHEN price < 10 THEN 'Bargain'           

                     WHEN price BETWEEN 10 and 20 THEN 'Average'           

                     ELSE 'Gift to impress relatives'     END in('Average','Bargain')  

     GROUP BY     CASE           

                     WHEN price IS NULL THEN 'Unpriced'           

                     WHEN price < 10 THEN 'Bargain'           

                     WHEN price BETWEEN 10 and 20 THEN 'Average'           

                     ELSE 'Gift to impress relatives'     END,       

                     Title   

     ORDER BY     CASE           

                     WHEN price IS NULL THEN 'Unpriced'           

                     WHEN price < 10 THEN 'Bargain'           

                     WHEN price BETWEEN 10 and 20 THEN 'Average'           

                     ELSE 'Gift to impress relatives'       

                     END,Title  

    解释:除了能够在select 中使用CASE 外,where 子句,group by 子句,order by 子句均可以使用

  3. 3

    3、比较

     1.DECODE 是Oracle特有的;

     2.CASE WHEN 是Oracle, SQL Server,MySQL 均可用;

     3.DECODE 只能用作相等判断,可是能够配合sign函数进行大于,小于,等于的判断;CASE可用于=,>=,<,<=,<>,is null,is not null 等的判断;

        4.DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活。

相关文章
相关标签/搜索