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

  • 相关阅读:
    Punycode
    delphi 打开资源管理器并定位到指定目录下的文件
    delphi 的一些备忘
    Delphi Rtti 笔记
    Delphi 关键字详解
    CryptSIPRetrieveSubjectGuid
    CAF(C++ actor framework)使用随笔(延迟发送,消息转发,消息优先级)(四)
    CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)
    CAF(C++ actor framework)使用随笔(send sync_send)(二)
    CAF(C++ actor framework)使用随笔(使用类去构建actor和使用的一些思路)
  • 原文地址:https://www.cnblogs.com/chero/p/2804940.html
Copyright © 2011-2022 走看看