这一节虽然题为“通用函数”,但其实并不“通用”,是有一定难度的。
暂且mark以下,后续如果需要,还需要杀个回马枪的
--11.6 通用函数
--11.6.1 通用函数列表
--使用USER和UID示例
SELECT USER,UID FROM dual;
--查询v$session示例(需使用system用户查看)
SELECT username, schema# FROM v$session WHERE username = USER;
--11.6.2 NVL和NVL2函数
--一个没有注意到NULL的例子
SELECT empno, ename, sal + comm as "salary" FROM emp WHERE deptno = 20;
--使用CASE语句来判断NULL值
SELECT empno,
ename,
CASE
WHEN comm IS NOT NULL THEN
sal + comm
ELSE
sal
END as "salary"
FROM emp
WHERE deptno = 20;
--使用NVL函数
SELECT empno, ename, sal + NVL(comm, 0) as "salary"
FROM emp
WHERE deptno = 20;
--使用NVL2函数
SELECT empno, ename, NVL2(comm, sal + comm, sal) as "salary", job
FROM emp
WHERE deptno = 20;
--11.6.3 Nullif和coalesce函数
--使用NULLIF函数
SELECT empno, ename, NVL(NULLIF(job, '销售'), '业务') job
FROM emp
WHERE deptno = 20;
select * from emp for update;
--COALESCE使用示例(从多个值中返回第一个不为null的值)
SELECT empno, ename, COALESCE(sal + comm, sal, comm + 2000, 2000) as "工资"
FROM emp
WHERE deptno = 20;
--11.6.4 Decode函数
--DECODE使用示例(多条件判断功能)
SELECT empno,
ename,
DECODE(job,
'职员',
1.15 * sal,
'销售人员',
1.20 * sal,
'经理',
2.0 * sal,
'分析人员',
1.12 * sal,
sal) 调薪表
FROM emp
WHERE deptno = 20;
--使用DECODE的行列置换示例(这个功能貌似很强大,也很实用)
SELECT deptno "员工部门",SUM(DECODE(job,'职员',sal+NVL(comm,0),0)) "职员",
SUM(DECODE(job,'分析人员',sal+NVL(comm,0),0)) "分析人员",
SUM(DECODE(job,'销售人员',sal+NVL(comm,0),0)) "销售人员",
SUM(DECODE(job,'经理',sal+NVL(comm,0),0)) "经理",
SUM(DECODE(job,'副理',sal+NVL(comm,0),0)) "副理",
SUM(DECODE(job,'老板',sal+NVL(comm,0),0)) "老板"
FROM emp GROUP BY deptno;
--Sys_guid函数
--SYS_GUID
SELECT SYS_GUID() FROM DUAL;
select dump(sys_guid()) from dual;
--创建函数
CREATE OR REPLACE FUNCTION My_Guid return VARCHAR2 AS
v_guid RAW(16);
BEGIN
v_guid:=SYS_GUID(); --生成GUID类型
--通过SUBSTR函数截取GUID结果,最终返回VARCHAR2(38)类型的值
RETURN '{'||substr(v_guid,1,8)||'-'||substr(v_guid,9,4)||'-'||substr(v_guid,13,4)||'-'||substr(v_guid,17,4)||'-'||substr(v_guid,20,12)||'}';
END;
SELECT My_Guid FROM dual;