oracle sql查询使用函数

查询过程中经常使用复杂的函数才能达到目的

1、nvl

NVL( A, B)   
    功能:如果A为NULL,则NVL函数返回B的值,否则返回A的值。   
    注意事项:A和B必须为同一数据类型,除非显示的使用TO_CHAR函数。
    例:NVL(TO_CHAR(num1),str2 ) 其中num1代指某个数字类型的值。    

NVL的扩展-NVL2(A,B,C)
   Oracle在NVL函数的功能上扩展,提供了NVL2函数。   

   NVL2(A, B, C)的功能为:如果A为NULL,则函数返回C,若A不为   null,则返回B。

2、case

(1)case when的两种表述方式

--简单Case函数  

CASE sex  
WHEN '1' THEN '男'  
WHEN '2' THEN '女'  
ELSE '其他' END  

--Case搜索函数  

CASE
WHEN sex = '1' THEN '男'  
WHEN sex = '2' THEN '女'  
ELSE '其他' END

(2)CASE WHEN 在语句中不同位置的用法

SELECT   grade, COUNT (CASE WHEN sex = 1 THEN 1      /*sex 1为男生,2位女生*/
                       ELSE NULL
                       END) 男生数,
                COUNT (CASE WHEN sex = 2 THEN 1
                       ELSE NULL
                       END) 女生数
    FROM students GROUP BY grade;


SELECT T2.*, T1.*
   FROM T1, T2
  WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
                   T1.SOME_TYPE LIKE 'NOTHING%'
                THEN 1
              WHEN T2.COMPARE_TYPE != 'A' AND
                   T1.SOME_TYPE NOT LIKE 'NOTHING%'
                THEN 1
              ELSE 0
           END) = 1

3、if

(1)if(exp,A,B)

select if(exp,A,B) from table;

当exp=true,返回A,否则返回B

与nvl的区别是,nvl是判断是否为null,而if判断是否为true

(2)if else

4、wm_concat函数
 

函数wm_concat(列名)可以把列值以","号分隔起来,并显示成一行
 
准备测试数据
 
SQL>createtabletest(id number,namevarchar2(20));
 
SQL>insertintotest values(1,'a');
 
SQL>insertintotest values(1,'b');
 
SQL>insertintotest values(1,'c');
 
SQL>insertintotest values(2,'d');
 
SQL>insertintotest values(2,'e');
 
SQL>commit;
 

 

效果1 :列转行
 
SQL>selectwm_concat(name)fromtest;
 
WM_CONCAT(NAME)
 
------------------------------
 
a,b,c,d,e
 

 

效果2: 把结果里的逗号替换成"|"
 
SQL>selectreplace(wm_concat(name),',','|')fromtest;
 
REPLACE(WM_CONCAT(NAME),',','|')
 
-----------------------------------------------------------------------
 
a|b|c|d|e
 

 

效果3:按ID分组合并name
 
SQL>selectid,wm_concat(name)namefromtest groupbyid;
 
IDNAME
 
---------- ------------------------------
 
1 a,b,c
 
2 d,e



5、行转列

使用case语句

select

 nvl(sum(case when ec_type = 'successuv' then cnt end),0) "兑换成功用户数"
,nvl(sum(case when ec_type = 'successpv' then cnt end),0) "兑换成功次数"
,nvl(sum(case when ec_type = 'failuv' then cnt end),0) "兑换失败用户数"
,nvl(sum(case when ec_type = 'failpv' then cnt end),0) "兑换失败次数"

from table


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值