[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) 左 / 右填充。表示将str1str2向左 / 向右填充成长度为len的字符串
replace(str1, str2, str3) 替换。表示将str1中的str2str3替换
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个开始,向左查找第3str2的位置。:无论a的正负,返回的都是绝对位置。

2、非空判断函数

参考笔记一,P18.1。

摘要 参数说明 返回值类型 / 返回值 说明
nvl(a, b) anull,返回 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 = w1w1true,返回 c1;若xx = w2w2true,返回 c2;否则返回 c3
decode(xx, w1, c1, w2, c2, c3) 作用同case()

3、日期函数

参考笔记一,P15.5。

摘要 参数说明 返回值类型 / 返回值 说明
months_between(d1, d2) 返回d1d2相差的自然月数
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的字符串,故仅能用于进行判断的位置,如:wherecheck()
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()

注:

  1. 一般将正则表达式称为“模式”。
  2. 以下函数的参数列表是“必须”部分,考虑到实用性,一些可选参数未列举出。如果大家有兴趣,需另行查找。
  3. 以下“模式”函数与相应单行函数功能相同,可参照上文【单行函数】学习。
  4. 出于篇幅考虑,以下函数的示例数据来源于下文【视图-示例】,不便之处请谅解。
  5. 如果大家不了解“模式”,可查阅博文《正则表达式全解析+常用示例》(转发);若要深入了解,可查阅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;

结果:
在这里插入图片描述

最后

掌握内置函数,我建议:自测。

本文持续更新中。。。

posted @ 2024-08-02 10:57  进步·于辰  阅读(9)  评论(0编辑  收藏  举报