表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点

异同点
  • 都可以对表行转列;
  • DECODE功能上和简单Case函数比较类似,不能像Case搜索函数一样,进行更复杂的判断
  • 在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)
DECODE方法 (Oracle公司独家)

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

--该函数的含义如下:    
IF    条件=值1 THEN RETURN(翻译值1)   
ELSIF 条件=值2 THEN RETURN(翻译值2)  
    ......  
ELSIF 条件=值n THEN RETURN(翻译值n)  
ELSE  RETURN(缺省值)  
END IF   
--行转列
SELECT name,  
       SUM(DECODE(Subject, '数学', Score, 0)) 数学,  
       SUM(DECODE(Subject, '语文', Score, 0)) 语文,  
       SUM(DECODE(Subject, '英语', Score, 0)) 英语  
FROM Scores 
GROUP BY name  
CASE WHEN
SELECT name,
SUM( CASE WHEN Subject='数学' THEN Score ELSE 0 END) 数学,
SUM( CASE WHEN Subject='语文' THEN Score ELSE 0 END) 语文,
SUM( CASE WHEN Subject='英语' THEN Score ELSE 0 END) 英语
FROM Scores group by name;

Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略,Else部分的默认值是NULL

Case具有两种格式,简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式

在Case函数中,可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等(也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。)

--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END

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

--根据条件有选择的UPDATE。
UPDATE Scores  SET grade = 
CASE WHEN score >= 85 THEN '优秀'
     WHEN score >= 70 AND score < 85  THEN '良好' 
     WHEN score >= 60 AND score < 70  THEN '及格'
ELSE '不及格' END; 

--在Case函数中使用聚合函数:COUNT, SUM, AVG, MAX, MIN
SELECT  name, 
CASE WHEN COUNT(*) = 1 THEN MAX(subject) 
ELSE MAX(CASE WHEN major = 'Y'  THEN subject ELSE NULL END) 
END AS major_subject
FROM Scores  GROUP BY name; 
Scores表结构和实现如下

表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点
表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点