1:比較大小函數 SIGN
sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1 ,例如:
引用
a=10,b=20
則sign(a-b)返回-1
則sign(a-b)返回-1
2:流程控制函數 DECODE
DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數,其他數據庫廠商還沒有實現此功能。假設想給職員加工資,其標准是:工資在8000元以下的將加20%;工資在8000元以上的加15%,8000 元的不加。實現:
select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee
含義解釋:
引用
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)
應用 行轉列
表結構:TEST_TB_GRADE:
- create table TEST_TB_GRADE
- (
- ID NUMBER(10) not null,
- USER_NAME VARCHAR2(20 CHAR),
- COURSE VARCHAR2(20 CHAR),
- SCORE FLOAT
- )
初始數據如下圖:
如果需要實現如下的查詢效果圖:
這就是最常見的行轉列,主要原理是利用decode函數、聚集函數(sum),結合group by分組實現的,具體的sql如下:
- select t.user_name,
- sum(decode(t.course, '語文', score,null)) as CHINESE,
- sum(decode(t.course, '數學', score,null)) as MATH,
- sum(decode(t.course, '英語', score,null)) as ENGLISH
- from test_tb_grade t
- group by t.user_name
- order by t.user_name
nvl
nvl(a,b) 如果a不為null 則返回a,如果a為null則返回b;
nvl2
nvl2(a,b,c) ,如果a不為null 則返回b,如果a為null則返回c;