[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18338279
出自【进步*于辰的博客】
目录
先言
字符串前有一个' '
(空字符),故首字母的位置是1
,不是0
(下文“开始位置”)。
1、单行函数
参考笔记一,P15.3、P39.1。
摘要 | 参数说明 | 返回值类型/返回值 | 说明 |
---|---|---|---|
substr(str, pos[, len]) |
pos-开始位置,可为负值 | 截取。截取方向始终向右 | |
round(a, b) |
b-精确位数 | 四舍五入。若b < 0 ,则向左精确,故round(a) 等价于round(a, 0) |
|
upper(str) |
转大写 | ||
lower(str) |
转小写 | ||
initcap(str) |
首字母大写 | ||
length(str) |
返回长度 | ||
concat(a, b) |
拼接,类似|| |
||
trunc(a, b) |
b-精确位数 | 数值取整(以10 为整) |
|
sysdate |
获取系统时间 | ||
instr(str1, str2[, pos][, n]) |
str2-查找字符,pos-开始位置,n-第几个 | 位置 | 查找,找不到返回0 。其中,instr(str1, str2) 等价于instr(str1, str2, 1, 1) |
lpad/rpad(str1, len, str2) |
左 / 右填充。表示将str1 用str2 向左 / 向右填充成长度为len 的字符串 |
||
replace(str1, str2, str3) |
替换。表示将str1 中的str2 用str3 替换 |
||
trim(str) |
去除前后空格 | ||
trim(leading/trailing/both/无 a from b) |
去除 b 中开头 / 结尾 / 开头和结尾 / 开头以及结尾的 a | ||
mod(a, b) |
等同于a%b ,余数符号跟 a |
1.1 lpad/rpad(str1, n, str2)
示例。
select lpad(rpad('csdn', 7, '#'), 10, '*') result from dual
结果:
若n < s1.length
,则无论lpad/rpad()
,结果都只显示s1
的前n
个字符(从左往右)。
1.2 instr(str1, str2[, pos][, n])
示例。
select instr(s1, s2, -2, 3) from dual;
表示在str1
中,从倒数第2
个开始,向左查找第3
个str2
的位置。注:无论a
的正负,返回的都是绝对位置。
2、非空判断函数
参考笔记一,P18.1。
摘要 | 参数说明 | 返回值类型 / 返回值 | 说明 |
---|---|---|---|
nvl(a, b) |
若a 为null ,返回 b,否则返回 a |
||
nvl2(a, b, c) |
若a 不为null ,返回 b,否则返回 c |
||
nullif(a, b) |
比较 a、b,若a = b ,返回null ,否则返回 a |
||
case xx when w1 then c1 when w2 then c2 else c3 end |
若xx = w1 或w1 为true ,返回 c1;若xx = w2 或w2 为true ,返回 c2;否则返回 c3 |
||
decode(xx, w1, c1, w2, c2, c3) |
作用同case() |
3、日期函数
参考笔记一,P15.5。
摘要 | 参数说明 | 返回值类型 / 返回值 | 说明 |
---|---|---|---|
months_between(d1, d2) |
返回d1 与d2 相差的自然月数 |
||
add_months(d, n) |
增加月数 | ||
next_day(d, '星期一') |
返回 d 后的第1个星期一 | ||
last_day(d) |
返回 d 当月的最后1天 | ||
round(d, 'dd') |
以day 四舍五入。'dd' 是格式码,其他格式码:'CC' → 世纪,'YY' → 年,'mm' → 月,'hh24' → 小时,'mi' → 分钟,'ss' → 秒。其中,round(d, 'dd') 等价于round(d) |
||
trunc(d, 'dd') |
同round() 。trunc(d, 'dd') 等价于trunc(d) |
||
extract(day from d) |
获取 d 的天数。day 是标识符,表示“天”。其他标识符:'year' → 年,'month' → 月, |
4、正则表达式相关函数
参考笔记三,P55.1。
摘要 | 参数说明 | 返回值类型 / 返回值 | 说明 |
---|---|---|---|
regexp_like(a, pattern) |
boolean | 类似like ,判断是否包含匹配模式pattern 的字符串,故仅能用于进行判断的位置,如:where 、check() |
|
regexp_substr(a, pattern, pos, n) |
n-第几个 | 类似substr() |
|
regexp_instr(a, pattern, pos, n) |
位置 | 类似instr() |
|
regexp_count(a, pattern) |
统计匹配模式的字符串个数 | ||
regexp_replace(a, pattern, str3) |
str3-用于替换的字符串 | 类似replace() |
注:
- 一般将正则表达式称为“模式”。
- 以下函数的参数列表是“必须”部分,考虑到实用性,一些可选参数未列举出。如果大家有兴趣,需另行查找。
- 以下“模式”函数与相应单行函数功能相同,可参照上文【单行函数】学习。
- 出于篇幅考虑,以下函数的示例数据来源于下文【视图-示例】,不便之处请谅解。
- 如果大家不了解“模式”,可查阅博文《正则表达式全解析+常用示例》(转发);若要深入了解,可查阅Pattern类中的【正则表达式的构造摘要】。
4.1 regexp_like(a, pattern)
示例:
select * from v where regexp_like(data, '#');
结果:
4.2 regexp_substr(a, pattern, pos, n)
示例:
select regexp_substr(data,'\d',1,1) as r11 from v;
select regexp_substr(data,'\d',1,2) as r12 from v;
select regexp_substr(data,'\d',1,3) as r13 from v;
select regexp_substr(data,'\d',2,1) as r21 from v;
select regexp_substr(data,'\d',2,2) as r22 from v;
select regexp_substr(data,'\d',2,3) as r23 from v;
select regexp_substr(data,'\d',3,1) as r31 from v;
select regexp_substr(data,'\d',3,2) as r32 from v;
select regexp_substr(data,'\d',3,3) as r33 from v;
结果:
4.3 regexp_instr(a, pattern, pos, n)
示例:
select regexp_instr(data,'\d',1,1) as r11 from v;
select regexp_instr(data,'\d',1,2) as r12 from v;
select regexp_instr(data,'\d',1,3) as r13 from v;
select regexp_instr(data,'\d',2,1) as r21 from v;
select regexp_instr(data,'\d',2,2) as r22 from v;
select regexp_instr(data,'\d',2,3) as r23 from v;
select regexp_instr(data,'\d',3,1) as r31 from v;
select regexp_instr(data,'\d',3,2) as r32 from v;
select regexp_instr(data,'\d',3,3) as r33 from v;
结果:
4.4 regexp_count(a, pattern)
示例:
select regexp_count(data, '\d') as count from v;
结果:
4.5 regexp_replace(a, pattern, str3)
示例:
select regexp_replace(data, '\d','?') as result from v;
结果:
最后
掌握内置函数,我建议:自测。
本文持续更新中。。。