Oracle基础知识(四)
目录
1.DECODE
2.CASE WHEN
写法1:CASE WHEN deptno=值
写法2:CASE deptno WHEN 值
case结合between写法
3.拼接字符:||
1.DECODE
DECODE 局限:只能用等值判断
DECODE函数语法:
DECODE(判断的字段,判断值1,返回值1,判断值2,返回值2,...,默认值);
示例:EMP表需要将英文的工作转换成中文
SALESMAN → 销售 MANAGER → 经理 PRESIDENT → 老板 其它的 → 职员
--DECODE写法
SELECT JOB, DECODE(JOB, 'SALESMAN', '销售', 'MANAGER', '经理', 'PRESIDENT', '老板', '职员') 中文
FROM EMP;
注意:最后的 ELSE 返回场景可以不写,默认返回为空
2.CASE WHEN
CASE WHEN 条件1 THEN 返回值1WHEN 条件2 THEN 返回值2ELSE 默认值 ---默认值 可以写也可以不写END;
注意:CASE WHEN 可以用多条件 以及 不等值判断
case when支持不等式写法,decode不支持
示例:输出dept表的部门名称 10 → 销售部 20 → 经理部 30 → 市场部 40 → 运营部
写法1:CASE WHEN deptno=值
SELECT CASEWHEN DEPTNO = 10 THEN '销售部'WHEN DEPTNO = 20 THEN '经理部'WHEN DEPTNO = 30 THEN '市场部'WHEN DEPTNO = 40 THEN '运营部'END
FROM DEPT;
写法2:CASE deptno WHEN 值
SELECT CASE DEPTNOWHEN 10 THEN '销售部'WHEN 20 THEN '经理部'WHEN 30 THEN '市场部'END
FROM DEPT;
示例:给每个员工一个员工级别,薪资在1000以内是低级,[1000,2000]是中级,2000以上是高级
SELECT EMPNO,CASEWHEN SAL < 1000 THEN '低级'WHEN SAL BETWEEN 1000 AND 2000 THEN '中级'WHEN SAL > 2000 THEN '高级'END GRADE
FROM EMP;-- 计算薪资等级是低级的员工数
SELECT COUNT(CASE WHEN SAL < 1000 THEN 1 END)
FROM EMP;
case结合between写法
CASE WHEN END 最终是返回某个字段值,所有可以用字段的地方都可以使用CASE WHEN END
示例:统计薪资在1000~2000区间的人数 2001~3000的人数以及1000以下的人数,以及 3000 以上的人数
SELECT COUNT(CASE WHEN SAL BETWEEN 1000 AND 2000 THEN EMPNO END) "统计薪资在1000~2000区间的人",COUNT(CASE WHEN SAL BETWEEN 2001 AND 3000 THEN EMPNO END) "统计薪资在2001~3000区间的人",COUNT(CASE WHEN SAL < 1000 OR SAL > 3000 THEN EMPNO END) "统计薪资在2001~3000区间的人"
FROM EMP;
计算每个部门中工资高于1500的人数占整个部门的人数比例
select deptno,round(count(casewhen sal > 1500 then1end) / count(1),4) * 100 || '%' as ctfrom empgroup by deptno;
将 EMP表的 英文岗位 替换成中文岗位名称(两种方法实现)
select job,decode(job,'CLERK','职员','SALESMAN','销售员','PRESIDENT','老板','MANAGER','经理','ANALYST','分析师') as ch_jobfrom empgroup by job;select job,case jobwhen 'CLERK' then'职员'when 'SALESMAN' then'销售员'when 'PRESIDENT' then'老板'when 'MANAGER' then'经理'else'分析师'end as ch_jobfrom empgroup by job;
3.拼接字符:||
【例】在EMP表中,查询工资在2000元以上的姓名以及工作。预期效果:SCOTT is a ANALYST
SELECT (ENAME || ' is a ' || JOB) AS "Employee Details"
FROM EMP
WHERE SAL > 2000;