Oracle字符处理笔记

1、使用trim+translate函数判断字段是否是数字:
select * from table where trim(translate(column,’0123456789’,’ ‘)) is NULL;

2、使用regexp_like函数返回字段是数字的全部数据:
select * from table where regexp_like(column,’^[0-9]+[0-9]$’);
要注意的是:regexp_like函数不是在所有的oracle版本中都能使用的。
regexp_like是oracle支持正则表达式的四个函数:regexp_like,regexp_replace,regexp_instr,regexp_substr中的 一个,有关这方面更加详细信息,请关注相关文档。
eg. select regexp_replace(‘hjbfgcoqwue8723r8fhescb938r’,’[^0-9]’) from dual;
得到的结果就是:87238938;
ORACLE中的支持正则表达式的函数主要有下面四个:

  • REGEXP_LIKE :与LIKE的功能相似
  • REGEXP_INSTR :与INSTR的功能相似
  • REGEXP_SUBSTR
  • REGEXP_REPLACE :与REPLACE的功能相似

它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
‘^’ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
RegExpMultiline ′ 匹 配 输 入 字 符 串 的 结 尾 位 置 。 如 果 设 置 了 R e g E x p 对 象 的 M u l t i l i n e 属 性 , 则 也匹
配 ‘\n’ 或 ‘\r’。
‘.’ 匹配除换行符之外的任何单字符。
‘?’ 匹配前面的子表达式零次或一次。
‘+’ 匹配前面的子表达式一次或多次。
‘*’ 匹配前面的子表达式零次或多次。
‘|’ 指明两项之间的一个选择。例子’^([a-z]+|[0-9]+) selectregexpreplace(hjbfgcoqwue8723aaAAAr8fhescXb938rz,[[:lower:]]|[[:upper:]])fromdual;()[]m,nm=<<=nmmm,m\numnumnum[[:alpha:]][[:digit:]][[:alnum:]][[:space:]][[:upper:]][[:lower:]][[:punct:]][[:xdigit:]]16[09afAF]\(),(?:),(?=),[],+,?,n,n,,n,m, ′ 表 示 所 有 小 写 字 母 或 数 字 组 合 成 的 字 符 串 。 s e l e c t r e g e x p r e p l a c e ( ‘ h j b f g c o q w u e 8723 a a A A A r 8 f h e 我 s c X b 938 r z ′ , ′ [ [ : l o w e r : ] ] | [ [ : u p p e r : ] ] ′ ) f r o m d u a l ; ‘ ( ) ′ 标 记 一 个 子 表 达 式 的 开 始 和 结 束 位 置 。 ‘ [ ] ′ 标 记 一 个 中 括 号 表 达 式 。 ‘ m , n ′ 一 个 精 确 地 出 现 次 数 范 围 , m =< 出 现 次 数 <= n , ′ m ′ 表 示 出 现 m 次 , ′ m , ′ 表 示 至 少 出 现 m 次 。 \num 匹 配 n u m , 其 中 n u m 是 一 个 正 整 数 。 对 所 获 取 的 匹 配 的 引 用 。 字 符 簇 : [ [ : a l p h a : ] ] 任 何 字 母 。 [ [ : d i g i t : ] ] 任 何 数 字 。 [ [ : a l n u m : ] ] 任 何 字 母 和 数 字 。 [ [ : s p a c e : ] ] 任 何 白 字 符 。 [ [ : u p p e r : ] ] 任 何 大 写 字 母 。 [ [ : l o w e r : ] ] 任 何 小 写 字 母 。 [ [ : p u n c t : ] ] 任 何 标 点 符 号 。 [ [ : x d i g i t : ] ] 任 何 16 进 制 的 数 字 , 相 当 于 [ 0 − 9 a − f A − F ] 。 一 般 用 在 图 片 编 码 检 测 上 。 各 种 操 作 符 的 运 算 优 先 级 \转 义 符 ( ) , ( ? : ) , ( ? = ) , [ ] 圆 括 号 和 方 括 号 ∗ , + , ? , n , n , , n , m 限 定 符 , , anymetacharacter 位置和顺序
|
*/

3、自动补全:
LPAD(id, 8, 0):给ID从前自动补0至8位字符;
RPAD(id, 8, 0):给ID从后自动补0至8位字符;
4、列转行:
WM_CONCAT(fieldname)
WMSYS.WM_CONCAT(fieldname)
配合group by使用。
eg:
SELECT training_dt,
WMSYS.WM_CONCAT(employee_ID)
FROM TraningTable
GROUP BY training_dt

5、取并集union,交集INTERSECT和差集MINUS:
eg:
差集MINUS:
获取两个表结构一样的数据的差集:
select * from table1 minus select * from table2
获得table1中存在但是table2中不存在的数据,会比对select中的每个字段的数据,会自动去重;
交集INTERSECT:获得两个表中数据完全一致的数据。
并集union:获得两个表中的所有数据合并,并去重。
并集union all:获得两个表中的所有数据合并,不去重。

6、取某行数据多个字段中的最大值greatest 和最小值least:
SELECT id, chinese, math, english,
greatest (chinese, math, english) max,
least(chinese, math, english) min
FROM tb;

7、Max(name) keep(dense_rank first/last order by id) over(partition by group_id)
以group id分组,获得id最大/最小的用户名。
Min(name) keep(dense_rank first/last order by id) over(partition by group_id)
以group id分组,获得id最小/最大的用户名。
first_values(name) order by id,group_id
获取id和group id升序下的第一个条数据的name数据。

8、ROW_NUMBER() over(order by DEPTID) as RNUM 根据部门无分组排序并标记rownum
partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
ROW_NUMBER() over(partition by deptid ORDER BY salary desc) as RNUM 以部门为分组,根据工资降序排序并标记row num。
注:在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行。
rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。
rank() over(partition by deptid order by salary)以部门为分组,根据工资升序排序并标记排名。此排名为部门内排名,即每个部门都有1、2、3。。。标记。
dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。dense_rank() over(partition by deptid order by salary) 以部门为分组,根据工资升序排序并标记排名。此排名为部门内排名,即每个部门都有1、2、3。。。标记。
For example:
使用ROW_NUMBER删除重复数据
—假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行。
DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE ) WHERE ROW_NO>1

9、ceil(n)向上取整,即取大于等于数值n的最小整数;
floor(n)向下取整,即取小于等于数值n的最大整数;
TRUNC(number[,decimals])截取小数点后decimals位取值;
TRUNC(date,[fmt])截取日期;
trunc(sysdate,’yyyy’) –返回当年第一天.
trunc(sysdate,’mm’) –返回当月第一天.
trunc(sysdate,’d’) –返回当前星期的第一天.
ROUND( number, [ decimal_places ] ):小数点后decimals位四舍五入取值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值