Oracle|内置函数之INSTR

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: 【7月更文挑战第5天】

背景

昨日,也就是25日,在墨天轮的「每日一题」上面答题,做错了,当再次认真审题的时候,发现了,哦吼。原来如此,明明是三个“surge”,……这?想着就再复习下这个函数吧。首先说下哈,这个栏目其实挺好的,每天做一题,查缺补漏也好,增长知识也罢,至少让自己都在学习中,是一件很快乐的事情。

(PS:我其实有些时候不理解自己,针对越是有些简单的题目,越是会做错,不知道有没有同我一样的题友?哭笑不得ing)

学习INSTR

关于INSTR

INSTROracle 数据库中的一种内置函数,用于在给定的字符串中查找子字符串,并返回子字符串首次出现的位置

Oracle 数据库提供了丰富的内置函数,涵盖数值处理字符串操作日期和时间处理逻辑判断、集合处理数据分析数据类型转换等多个方面。下面就随着我一起来学习下这个内置函数吧,有解释不到之处,还望批评指正。

操作环境

为了方便演示,我直接在线上SQL环境进行演示,当前演示环境信息如下:

语法格式

【语法格式】

INSTR(string1, string2[, start_position[, occurrence]])

【参数描述】

  • string1(必填):源字符串,即要在其中搜索子串的字符串(简单理解,在哪里查找string2)。
  • string2(必填):目标子串,即要查找的字符串(简单理解,被查找的字符串)。
  • start_position(可选):指定从源字符串中的哪个位置开始搜索(开始检索的位置),值必须是一个非0的整数。
  • 当省略不填写时默认值为1,那么表示从源字符串的起始处开始搜索。
  • 当填写的位置的数值为负数时,那么表示搜索将从源字符串的倒数相应位置开始(例如,-1表示从最后一个字符开始)。
  • occurrence(可选):指定要查找子串在源字符串中第几次(出现的频率)出现的位置,值必须是一个整数。
  • 当省略不填写时默认值为1,即查找第一次出现的位置。
  • 当填写的位置的数值大于1的值时,则查找指定次数的出现位置。
  • 当填写的次数不存在(即子串在源字符串中出现次数少于指定次数),则返回0。

⚠️注意:关于Oracle中INSTR的语法,可以参考此处:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/img_text/instr.html

示例解析

下面举一个列子,也就从这个例子开始吧(这图是真难画,使用PPT画的,凑合看吧)。很简单的一个句子:不装了,摊牌了,我又做错了

默认情况

INSTR([检索字符串], [被检索的字符串])

SELECT INSTR( '不装了,摊牌了,我又做错了', '了' ) FROM dual;

上面结果表示,使用这个函数之后,从字符串(不装了,摊牌了,我又做错了)每个字符开始检索,首次匹配到「了」后返回「了」在整个字符串中的位置值。从上面的图标注也可以看出来,默认情况下,匹配到目标字符串「了」的位置为3,所以结果正好是3。

有检索位置

INSTR([检索字符串], [被检索的字符串], [检索位置])

SELECT INSTR( '不装了,摊牌了,我又做错了', '了', 1) FROM dual;

SELECT INSTR( '不装了,摊牌了,我又做错了', '了', -1) FROM dual;

此时,上述语句的结果等同于下面的语句结果,也就是我们默认情况:

SELECT INSTR('不装了,摊牌了,我又做错了', '了') FROM dual;

当开始位置为负数时,其实是从右边开始检索,然后找出「了」所在的位置,即排在13位置(当真正理解这个函数的的意义的时候,其实就很好的处理这类问题)。这里其实还是有疑问,例如我是下面的语句,会如何呢?

SELECT INSTR('不装了,摊牌了,我又做错了', '了', 2) FROM dual;

SELECT INSTR('不装了,摊牌了,我又做错了', '了', 3) FROM dual;

大家可以尝试下,其实上面两个结果都是3,结果如下展示:

有检索频率

INSTR([检索字符串], [被检索的字符串], [检索位置], [检索频率])

SELECT

   INSTR( '不装了,摊牌了,我又做错了', '了', 4, 1) default_1,

   INSTR( '不装了,摊牌了,我又做错了', '了', 9, 2) default_2

FROM dual;

上面查询的字段「default_1」的含义是从第4个位置开始匹配,匹配1次后的「了」字的位置,对照上面的表,可以看出来是7;字段「default_2」是从第9个位置开始匹配,匹配2次「了」字的位置,其实第一次匹配到了「我有做错了」中的「了」字,后续再匹配找不到匹配结果,所以此时返回0。

错题解析

回归到正题,其实我个人认为,当看到语法格式的时候,已经可以把这一题目做对了,而我却又偏偏做错了,而且还错的那么离谱,这对我来说,的确是值得反思的一件事情。当看完示例解析之后,答案是不是显而易见了?开头讲到的题目的正确答案为 A

总结

失败不可怕,错误也不可怕,有错就要认,挨打要立正,多多学习知识,多多记笔记,好处蛮多。

[引入介绍]

  1. 官方说明:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/INSTR.html
  2. 盖国强老师整理的材料真好:https://www.modb.pro/db/22372
  3. INSTR说明:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/img_text/instr.html
相关文章
|
1月前
|
SQL Oracle 算法
|
1月前
|
SQL Oracle 关系型数据库
|
1月前
|
Oracle 关系型数据库 数据挖掘
|
1月前
|
Oracle 关系型数据库 数据挖掘
|
2月前
|
存储 Oracle NoSQL
Oracle中decode函数详解
Oracle中decode函数详解
|
2月前
|
Oracle 关系型数据库 大数据
oracle递归函数
oracle递归函数
|
3月前
|
NoSQL Oracle 关系型数据库
MongoDB与Oracle:管道函数兼容之道
【4月更文挑战第20天】
31 2
|
3月前
|
Oracle 关系型数据库 数据管理
Oracle常用系统函数之日期和时间类函数:时空穿梭者的魔法棒
【4月更文挑战第19天】Oracle数据库中的日期和时间函数是强大的工具,如同时空穿梭者的魔法棒。`SYSDATE`和`CURRENT_TIMESTAMP`能显示当前时间,助你在数据中记录关键时刻;`ADD_MONTHS`函数让你轻易跃过月份,实现时间穿越;而`TO_DATE`和`TO_CHAR`则负责日期和时间的格式转换,如同时间的化妆师。除此之外,还有`EXTRACT`、`LAST_DAY`等更多魔法道具,帮助数据管理专家们自如操控时间,解决各种挑战。掌握这些函数,你也能在数据世界中自由穿梭!
|
3月前
|
Oracle 算法 关系型数据库
Oracle常用系统函数之数字类函数:数字的魔术师
【4月更文挑战第19天】Oracle数据库中的数字类函数是数字处理的魔术师,包括`ROUND`(四舍五入),`CEIL`和`FLOOR`(向上/下取整),以及`ABS`(计算绝对值)。还有`MOD`、`TRUNC`和`POWER`等函数,提供求余数、截断和计算幂的功能。熟练运用这些函数能提升数据管理效率,让处理数字变得更简单、有趣。
|
3月前
|
存储 SQL Oracle
Oracle创建函数:数据王国的“魔法秘籍”
【4月更文挑战第19天】Oracle函数是数据处理的利器,专注于计算与返回值。通过`CREATE OR REPLACE FUNCTION`定义函数名、参数及返回类型,如示例中的加法函数`add_numbers`。调用函数时,可将其结果赋值给变量。函数可包含复杂逻辑和SQL,与其他数据库对象交互,用于触发器或存储过程。注意函数设计的唯一性、参数类型和性能优化。掌握函数使用能提升代码可读性和数据库管理效率。