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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM