数字操作函数
1 | SELECT Trunc(1234.56, 1) "1234.5" --截取 |
日期操作函数
1 | SELECT To_Date('2017-11-11 09:00:00', 'YYYY-MM-DD HH24:MI:SS') 字符转日期 |
处理时间间隔
NUMTODSINTERVAL
单位:’DAY’、’HOUR’、’MINUTE’、’SECOND’
1 | SELECT (To_Date('2017-11-11', 'YYYY-MM-DD') + Numtodsinterval(3, 'DAY')) "2017-11-14" |
NUMTOYMINTERVAL
单位:’YEAR’、’MONTH’
1 | SELECT (To_Date('2017-11-11', 'YYYY-MM-DD') + Numtoyminterval(3, 'YEAR')) "2020-11-11" |
字符串操作函数
大小写转换
1 | SELECT Lower('ORACLE') "sql" --小写 |
获取字符串长度
1 | SELECT Length('ORACLE') "6" --获取字符长度(字母汉字都占1位) |
字符串截取
1 | SELECT Substr('ORACLE数据库', 7) "数据库" --从第7位往后截取 |
字符串替换
1 | SELECT REPLACE('ORACLE数据库', 'ORACLE', 'oracle') "oracle数据库" |
查找字符串位置
1 | SELECT Instr('ORACLE数据库', '据', 1, 1) "8" --查找第1位开始,第1次匹配的字符串位置 |
字符填充
1 | SELECT Lpad('ORACLE', 10, '*') "****ORACLE" --左填充 |
NVL
1 | SELECT Nvl(1, 2) "1" --如果1为空,返回2 |
FOR UPDATE
对查询出来的数据加行级锁
- FOR UPDATE:如果数据正在被锁定,会等到数据被释放(commit)后才执行锁定
- FOR UPDATE NOWAIT:发现数据被锁定,立刻返回报错
1 | SELECT * FROM Emp FOR UPDATE NOWAIT; |
也可用于在PL\SQL DEV中快速DML操作
字符串分割
默认用英文逗号分隔,也可以在后面指定分隔符号
1 | SELECT t.Column_Value FROM TABLE(Split('AAA,BBB,CCC', ',')) t; |
GREATEST
比较数值大小,当存在NULL时,返回NULL
1 | SELECT Greatest('A', 'B', 'C') "C" FROM Dual; |
URL编码解码
ESCAPE编码
1 | BEGIN |
UNESCAPE解码
1 | BEGIN |
分组排序/计算
- RANK:跳跃排序
- DENSE_RANK:连续排序
- ROW_NUMBER:没有重复值排序
- MAX/MIN:分组求最大最小值
- LAG: 获取当前记录往前面1行Sal的值,没有则默认值为100
- LEAD:获取当前记录往后面1行Sal的值,没有则默认值为100
- RATIO_TO_REPORT:计算Sal占总数的比例
1 | SELECT t.Ename |

MERGE
用于两个表之间数据的更新同步,基于源表对目标表做Insert,Update,Delete操作
1 | MERGE INTO Targettable t |
TIPS:
MERGE为以上固定写法,DELETE只会对MATCHED所有数据进行删除筛选,UPDATE更新后的数据如果符合删除条件,也会被删除
INSERT ALL/FIRST
一个来源插入多个目标表
FIRST:考虑先后关系,如果有数据满足多个WHEN条件,则只执行第一个WHEN
ALL:不考虑先后关系,只要满足条件就插入
1 | INSERT ALL |
表结构行转列
1 | --init |
执行结果:

行转列
按照IN里面的参数进行分列,如果Job能跟IN中参数列对应上,就将Ename放入字段中,注意Ename必须放在聚合函数中
1 | SELECT * |

列转行
除Ename列以外的列全部转成行,这些列必须是同一类型,Columnkey和Columnvalue为自定义名字,代表列名和列值
1 | SELECT Ename |

字符拼接
字符串用逗号分割拼接,长度不能超过4000
1 | SELECT Wm_Concat(DISTINCT e.Ename) FROM Emp e; |

12c以后换成Listagg
1 | SELECT e.Deptno |

TIPS:以下两种方法可以实现长度不受限制
方法1:
1 | SELECT TRIM(Xmlagg(Xmlelement(Content, e.Ename || ',') ORDER BY e.Empno).Extract('//text()')) AS Concat |
方法2:
1 | SELECT Dbms_Lob.Substr(Rtrim(Xmlagg(Xmlparse(Content e.Ename || ',' Wellformed) ORDER BY e.Empno) |
树形遍历
向上遍历根节点
1 | SELECT t.Empno |

向下遍历子节点
1 | SELECT t.Empno |

随机数
1 | SELECT LEVEL Seq_Data |
休眠
1 | DBMS_LOCK.SLEEP(30);--休眠30秒 |