oracle 各种常用函数讲解

 1. 连接字符串,用逗号隔开
--vmsys.wm_concat函数使用 如下所示,按部门进行分组,同一组的在一行中用逗号隔开
SELECT deptno, wmsys.wm_concat(distinict(ename)) FROM scott.emp GROUP BY deptno; 
  
   特点:(1)wm_concat 函数占用临时表空间
          (2)这个函数最大支持30K
今天在测试库环境下用wm_concat查出来的数据是clob类型,因此要把clob转化为varchar2
to_char(substr(mw.context(name),0,1000))    
注意:截取到3500的时候 就开始抛异常了

   MySQL中group_concat函数连接字符串

完整的语法如下:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 


 2.  decode()函数

主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);

使用方法:

Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

From talbename

Where …

其中columnname为要选择的table中所定义的column,

·含义解释: 

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

注:其中缺省值可以是你要选择的column name 本身,也可以是你想定义的其他值,比如Other等;


  3. NVL,NVL2,NULLIF,COALESCE
   
    nvl 函数

NVL函数的格式如下:NVL(expr1,expr2)

含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。

select ename,NVL(comm, -1) from scott.emp; 


  nvl2 函数

NVL2函数的格式如下:NVL2(expr1,expr2, expr3)

含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。


  nullif函数

NULLIF(exp1,expr2)函数的作用是如果exp1和exp2相等则返回空(NULL),否则返回第一个值。

 select nullif(2,1) from dual  ---> 2

 select nullif(1,1) from dual  ----> 空


  Coalesce函数

Coalese函数的作用是的NVL的函数有点相似,其优势是有更多的选项。

格式如下:

Coalesce(expr1, expr2, expr3….. exprn)

表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。
返回表达式中第一个非空表达式,如有以下语句:   SELECT COALESCE(NULL,NULL,3,4,5) FROM dual   其返回结果为:3
如果所有自变量均为 NULL,则 COALESCE 返回 NULL 值。   COALESCE(expression1,...n) 与此 CASE 函数等价:
这个函数实际上是NVL的循环使用,在此就不举例子了。


 4. instr 函数

语法如下: 
   instr( string1, string2, start_position,nth_appearance ) [1]  [2] 
string1
源字符串,要在此字符串中查找。
string2
要在string1中查找的字符串 。
start_position
代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
nth_appearance
代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
注意: 
  位置索引号从1开始。
  如果String2在String1中没有找到,instr函数返回0。
  示例: 
  SELECT instr('syranmo','s') FROM dual; -- 返回 1 
  SELECT instr('syranmo','ra') FROM dual; -- 返回 3 
  SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0

5 substr 函数
SUBSTR(string,start_position,[length])    求子字符串,返回字符串
解释:string 元字符串
       start_position   开始位置(从0开始)
       length 可选项,子字符串的个数
For example:
substr("ABCDEFG", 0); //返回:ABCDEFG,截取所有字符 
substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符 
substr("ABCDEFG", 0, 3); //返回:ABC,截取从A开始3个字符 
substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。 
substr("ABCDEFG", -3); //返回:EFG,注意参数-3,为负值时表示从尾部开始算起,字符串排列位置不变。


 

6. case when then else end 
  case when then else end  可以在查询列中使用,也可以在where条件中使用
如:
 
  String sql =" SELECT AER.RES_ID,AER.PATIENT_ID,AER.EVENT_NO,P.NAME,AER.OUT_DEPT_NAME,"
				+" CASE WHEN (AER.TYPE=4 AND AR.HIS_YL_PROCESS =2) THEN AR.HIS_YL_SCORE END HIS_YL_SCORE,"
				+" CASE WHEN (AER.TYPE=7 AND AR.HIS_MZ_PROCESS =2) THEN AR.HIS_MZ_SCORE END HIS_MZ_SCORE,"
				+" CASE WHEN (AER.TYPE=4 AND AR.HIS_YL_PROCESS =2) THEN AR.HIS_YL_LEVEL END HIS_YL_LEVEL,"
				+" CASE WHEN (AER.TYPE=7 AND AR.HIS_MZ_PROCESS =2) THEN AR.HIS_MZ_LEVEL END HIS_MZ_LEVEL,"
				+" CASE WHEN (AR.ONLINE_PROCESS =2) THEN AR.ONLIN_SCORE END ONLIN_SCORE,"
				+" CASE WHEN (AR.ONLINE_PROCESS =2) THEN AR.ONLINE_LEVEL END ONLINE_LEVEL"
				+" FROM AUDIT_EMR_REPAIR AER "
				+" INNER JOIN AUDIT_RESULT AR ON AER.RES_ID = AR.RES_ID"
				+" INNER JOIN AUDIT_RESULT_DETAIL ARD ON ARD.RES_ID = AER.RES_ID"
				+" INNER JOIN EMR_CONTENT EC ON EC.EMR_ID = ARD.EMR_ID"
				+" INNER JOIN PATIENT P ON P.PATIENT_ID=AER.PATIENT_ID"
				+" WHERE AER.REPAIR_STATUS = 1 AND AER.ISSUE_STATUS = 1 AND AER.TYPE=4 AND ARD.TYPE IN (1,4) " //AER.TYPE IN(4,7) AND ARD.TYPE IN (1,4,7)
	            +" AND (CASE WHEN (EC.MODIFIOR_ID ='' or EC.MODIFIOR_ID is null) THEN EC.CREATOR_ID ELSE EC.MODIFIOR_ID END) = '"+doctorId+"'"

7.  to_date  to_char
 这两个函数是非常重要,而且用的比较多。 
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss')    from dual --字符串转换为日期  
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   --日期转化为字符串   
select to_char(to_date('2015-1-25','yyyy-mm-dd'),'day') from dual;  --求某天是星期几  

8. 字符串连接
  oracle 连接字符串有两种方法:(1) ||  (2)concat
     select   '您好:'   ||   28    as  text  from  dual ;
   select concat('您好:',28) as text from dual;

9. 字符串长度  length() 和 lengthb()
  lengthb(string)计算string所占的字节长度 : 返回字符串的长度,单位是字节
 length(string)计算string所占的字符长度 : 返回字符串的长度,单位是字符  
 select length('国') from dual; --1
 select lengthb('国') from dual; --2
 select length('AB') from dual; --2
 select lengthb('AB') from dual; --2  

10 大小写转换 
    lower()  转化为小写
    upper()  转化为大写
 select lower('ADFDc') as text from dual; --ADFDC
 select upper('adfDFDF') as text from dual; --ADFDFDF  

11--Oracle trunc()函数的用法
/**************日期********************/
1.select trunc(sysdate) from dual   --2011-3-18  今天的日期为2011-3-18
2.select trunc(sysdate, 'mm')   from   dual   --2011-3-1    返回当月第一天.
3.select trunc(sysdate,'yy') from dual   --2011-1-1       返回当年第一天
4.select trunc(sysdate,'dd') from dual   --2011-3-18    返回当前年月日
5.select trunc(sysdate,'yyyy') from dual   --2011-1-1   返回当年第一天
6.select trunc(sysdate,'d') from dual   --2011-3-13 (星期天)返回当前星期的第一天
7.select trunc(sysdate, 'hh') from dual    --2011-3-18 14:00:00   当前时间为14:41   
8.select trunc(sysdate, 'mi') from dual   --2011-3-18 14:41:00   TRUNC()函数没有秒的精确
/***************数字********************/
/*
TRUNC(number,num_digits) 
Number 需要截尾取整的数字。 
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
*/
9.select trunc(123.458) from dual  --123
10.select trunc(123.458,0) from dual  --123
11.select trunc(123.458,1) from dual  --123.4
12.select trunc(123.458,-1) from dual  --120
13.select trunc(123.458,-4) from dual  --0
14.select trunc(123.458,4) from dual   --123.458
15.select trunc(123) from dual   --123
16.select trunc(123,1) from dual  --123
17.select trunc(123,-1) from dual  --120

12 replace 函数用法如下:

replace('将要更改的字符串','被替换掉的字符串','替换字符串')

例:select replace('AABBCCDD','BB','FF') as text from dual; --AAFFCCDD


 
   
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值