zoukankan      html  css  js  c++  java
  • oracle中decode函数 VS mysql中的if函数和case函数

    oracle中有decode函数,如下:

      select sum(decode(sex,'男',0,1)) 男生数 from school;

    统计男生数目,含义为:decode()中sex字段为男时,用1代替,然后计算总和

    而mysql中没有该函数,替代的有case与if函数。

    case函数

    同样统计男女生人数,语句如下:

    SELECT school,COUNT(school) 人数,
      SUM(CASE
        WHEN sex='男'THEN 1
        ELSE 0
        END)
      男生数,
      SUM(CASE
        WHEN sex='女'THEN 1
        ELSE 0
        END)
      女生数
    FROM sch
    GROUP BY sex,school

    CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用CASE

    首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下: 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    SELECT <myColumnSpec> = 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    WHEN <A> THEN <somethingA> 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    WHEN <B> THEN <somethingB> 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    ELSE <somethingE> 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    END 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子: 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    USE pubs 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GO 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    SELECT 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title, 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    'Price Range' = 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price IS NULL THEN 'Unpriced' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price < 10 THEN 'Bargain' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price BETWEEN 10 and 20 THEN 'Average' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    ELSE 'Gift to impress relatives' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    END 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    FROM titles 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    ORDER BY price 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GO 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁这是 
    CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE: 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    SELECT 'Number of Titles'Count(*
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    FROM titles 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GROUP BY 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price IS NULL THEN 'Unpriced' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price < 10 THEN 'Bargain' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price BETWEEN 10 and 20 THEN 'Average' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    ELSE 'Gift to impress relatives' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    END 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GO 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁你甚至还可以组合这些选项,添加一个 
    ORDER BY 子句,如下所示: 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    USE pubs 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GO 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    SELECT 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price IS NULL THEN 'Unpriced' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price < 10 THEN 'Bargain' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price BETWEEN 10 and 20 THEN 'Average' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    ELSE 'Gift to impress relatives' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    END AS Range, 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    FROM titles 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GROUP BY 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price IS NULL THEN 'Unpriced' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price < 10 THEN 'Bargain' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price BETWEEN 10 and 20 THEN 'Average' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    ELSE 'Gift to impress relatives' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    END
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    ORDER BY 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    CASE 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price IS NULL THEN 'Unpriced' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price < 10 THEN 'Bargain' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    WHEN price BETWEEN 10 and 20 THEN 'Average' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
    ELSE 'Gift to impress relatives' 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
    END
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
    GO 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁 
    sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁注意,为了在 
    GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。

    if语句

    同样统计男女生人数,语句如下:

    SELECT school,COUNT(school) 人数,SUM(IF(sex='男',1,0)) 男生数,SUM(IF(sex='女',1,0)) 女生数,
      SUM(IF(pass=1,1,0)) pass1,SUM(IF(pass=0,1,0)) pass0,
      SUM(IF(state=1,1,0)) state1,SUM(IF(state=0,1,0)) state0
    FROM sch
      GROUP BY sex,school

    语法和decode类似。

     参见曹欢欢的博客http://home.ustc.edu.cn/~chh1990/chero/blog/blog.html

  • 相关阅读:
    FormsAuthentication 简单使用
    2.0 泛型
    解决Eclipse java build path中Web App Libraries无法自动找到WEBINF的lib目录
    WinHex 15.8 r4 注册信息
    用ClassPathXmlApplicationContext读取Spring配置文件的路径问题
    Installing NFS on CentOS 6.2
    使用XStream对Java对象进行序列化和反序列化
    Eclipse代码注释模板code template
    Timestamp和String的相互转换 Java
    visual studio vs2010 2012 C/C++ 编译找不到mspdb100.dll文件的解决方法
  • 原文地址:https://www.cnblogs.com/chero/p/2804940.html
Copyright © 2011-2022 走看看