Oracle常用函数

1、CASE WHEN

CASE WHEN condition THEN return_expr

     WHEN condition THEN return_expr

     ...

ELSE else_expr

END

when:

sex = ‘1’
salary > 500 AND salary <= 600
BETWEEN 0 AND 1

SELECT (CASE
         WHEN FIELD_NAME BETWEEN 0 AND 1 THEN
          '0 - 1'
         WHEN FIELD_NAME BETWEEN 1 AND 2 THEN
          '1 - 2'
         ELSE
          '2 - 100'
       END) AS FIELD_NAME
  FROM TABLE
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
SELECT  
CASE WHEN salary <= 500 THEN '1'  
WHEN salary > 500 AND salary <= 600  THEN '2'  
WHEN salary > 600 AND salary <= 800  THEN '3'  
WHEN salary > 800 AND salary <= 1000 THEN '4'  
ELSE NULL END salary_class, -- 别名命名
COUNT(*)  
FROM    Table_A  
GROUP BY  
CASE WHEN salary <= 500 THEN '1'  
WHEN salary > 500 AND salary <= 600  THEN '2'  
WHEN salary > 600 AND salary <= 800  THEN '3'  
WHEN salary > 800 AND salary <= 1000 THEN '4'  
ELSE NULL END;

2、Sign

比较大小函数SIGN
sign(x)或者Sign(x)叫做符号函数,其功能是取某个数的符号(正或负):
当x>0,sign(x)=1
当x=0,sign(x)=0
当x<0,sign(x)=-1
x可以是函数或计算表达式

3、Decode
将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值
decode (expression, search_1, result_1, search_2, result_2, …., search_n, result_n, default)

SELECT DECODE(JOB,'VP','VP_CEO','CEO','VP_CEO','OPERATION') JOB,

   COUNT(*) JOB_CNT

FROM t1

 GROUP BY  DECODE(JOB,'VP','VP_CEO','CEO','VP_CEO','OPERATION');
  1. 按字段内容排序
SELECT ID,DEPT_NAME,REGION_ID

 FROM t2

 ORDER BY DECODE(DEPT_NAME,

                                          'deptA',1,

                                          'deptb',2,

                                          3);
  1. 按字段内容指定动态列排序
需求:若DEPT_NAME为deptA,则按ID升序排列,否则按REGION_ID升序排序

 SELECT ID,DEPT_NAME,REGION_ID

 FROM t2

 ORDER BY DECODE(DEPT_NAME,

                                         'deptA',ID,

                                         REGION_ID); 
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student

decode实现比较  
SELECT DECODE(SIGN(TO_DATE('20201010', 'YYYY/MM/DD') - SYSDATE),
              -1,
              TO_DATE('20101010', 'YYYY/MM/DD'),
              SYSDATE)
  FROM DUAL;

4、lag() 和 lead()
over()表示 lag() 与 lead() 操作的数据都在 over() 的范围内,他里面可以使用 partition by 语句(用于分组) order by 语句(用于排序)。partition by a order by b 表示以 a 字段进行分组,再以 b 字段进行排序,对数据进行查询。

5、instr
instr可以代替like来进行模糊查询,效率很高
instr(title,’手册’)>0 相当于 title like ‘%手册%’
instr(title,’手册’)=1 相当于 title like ‘手册%’
instr(title,’手册’)=0 相当于 title not like ‘%手册%’
特殊用法:
select id, name from users where instr(‘101914, 104703’, id) > 0;
它等价于
select id, name from users where id = 101914 or id = 104703;

6、lpad 和 rpad
lpad( string1, padded_length, [ pad_string ] )
string1:源字符串
padded_length:最终返回的字符串的长度,如果最终返回的字符串的长度比源字符串的小,那么此函数实际上对源串进行截断处理
pad_string:用于填充的字符,可以不填,默认为空字符
eg:
–返回值长度大于源字符串长度,将进行填充
select lpad(‘zhanglt’,10,’z’) from dual;
结果为:zzzzhanglt
–返回值长度小于源字符串长度,将进行截断
select lpad(‘zhanglt’,3,’z’) from dual;
结果为:zha

7、replace
REPLACE(‘abcd’,’a’,’’)
将字符串中的某个字符串替换为某个字符串 REPLACE(‘abcd’,’a’)
将字符串中的a都删除掉

8、GREATEST
GREATEST(‘A’,2,3,’Ab’)
比较数非空时取最大,有空则为空

9、NVL
NVL(expr1,expr2)
如果expr1为空则显示expr2的值,否则显示expr1的值

10、NVL2
NVL2(expr1,expr2, expr3) 如果expr1为空则显示expr2的值,否则显示expr3的值

11、NULLIF
NULLIF(exp1,expr2)
如果expr1与expr2相等则返回空(NULL),否则返回expr1值

12、Coalesce
Coalesce(expr1, expr2, expr3….. exprn)
如果所有expr都为null,返回null,否则返回第一个不为空的expr
coalesce(exp1,0)将exp1为空的数据转为0

13、substr
substr(‘helloworld’,-3)
返回expr1的后三位,倒数第三位开始截取。——rld
substr(‘helloworld’,-3,1)
倒数第三位开始截取一位。——r
substr(‘helloworld’,0,3)和substr(‘helloworld’,1,3)
从第一位开始截取3位。——hel
substr(‘helloworld’,3)
从第三位开始截取。——lloworld

14、translate
translate(expr,from_string,to_string)
将expr中对应的字符进行修改,from_string中的字符与to_string中的一一对应,没有对应的字符则对应空
Translate(‘aaaaaasssssss’,’as’,’2311’)——2222223333333
Translate(‘asbf’,’as’,’2’)——2bf

15、REGEXP_COUNT
字符串匹配次数
regexp_count (‘The pro-niece was born today, so exciting.’, ‘a’)——2
支持从指定位置检测,大小写敏感

16、regexp_replace
正则表达式替换
regexp_replace(‘abc10’,’[0-9]’,’’)——abc
regexp_replace(‘abc10’,’^[0-9]’,’’)——10

17、regexp_like
regexp_like(data,’a’)== like ‘%a%’
regexp_like(data,’^a’)== like ‘a%’
regexp_like(data,’a$’)== like ‘%a’
regexp_like(data,’^$a’)== like ‘a’

18、listagg
listagg(ename,’,’) within group(order by ename)多行转列,以逗号分隔

19、wm_concat
与listagg一样,实现的是多行转列

20、to_char
to_char,函数功能,就是将数值型或者日期型转化为字符型
高级
Select TO_CHAR(123.0233,’FM9999999.0099’) FROM DUAL
FM:除空格、9999999.0099:允许小数点左边最大正数为7位,小数点右边最少2位,最多4位,且对第5位进行四舍五入

Blog

Dump

Project