Oracle instr函数与substr函数以及自制分割函数

instr通常被用来作为判断某个字符串中是否含有执行字符串和将返回结果作为一些数据分割的数据,即有模糊查询like的作用,当返回的查询结果的序号为0的时候就是没有匹配上

substr函数就是很简单明了,就是个截取字符函数

instr函数

通常使用instr函数有三种格式

  1. instr(字符串,要匹配的字符串)
  2. instr(字符串,要匹配的字符串,起始位置)
  3. instr(字符串,要匹配的字符串,起始位置,匹配次序)

实质上都是instr(字符串,要匹配的字符串,起始位置,匹配次序),只不过前两个参数一定要有数据,后两个参数如果不填就默认为1,无论是从前查还是从后查,执行的字符串顺序是不变的

示例

--在ababc中查找a,只有两个参数的时候,起始位置和匹配次序默认为1,即从位置1开始,查询第一次匹配的位置,即结果为1
select instr('ababc','a') from dual
;
--在ababc中查找a,只有三个参数的时候,匹配次序默认为1,起始位置填写2的话,即从位置2开始,查询第一次匹配的位置,即结果为3
select instr('ababc','a',2) from dual
;
--在ababc中查找a,有四个参数的时候,起始位置填写1,匹配次序填写2,即从位置1开始,查询第二次匹配的位置,即结果为3
select instr('ababc','a',1,2) from dual
;
--在ababc中查找a,有四个参数的时候,起始位置填写2,匹配次序填写2,即从位置2开始,查询第二次匹配的位置,查询不到结果,即结果为0
select instr('ababc','a',2,2) from dual
;
--在ababc中查找a,有四个参数的时候,起始位置填写-1,匹配次序填写1,即从位置5(-1就是从后往前查询)开始,查询第一次匹配的位置,即结果为3
select instr('ababc','a',-1,1) from dual
;
--在ababc中查找ab,只有两个参数的时候,起始位置和匹配次序默认为1,即从位置1开始,查询第一次匹配的a(ab的开头是a)位置,即结果为1
select instr('ababc','ab') from dual
;
--在ababc中查找ab,只有三个参数的时候,匹配次序默认为1,起始位置填写2的话,即从位置2开始,查询第一次匹配的a(ab的开头是a)位置,即结果为3
select instr('ababc','ab',2) from dual
;
--在ababc中查找ab,有四个参数的时候,起始位置填写1,匹配次序填写2,即从位置1开始,查询第二次匹配的a(ab的开头是a)位置,即结果为3
select instr('ababc','ab',1,2) from dual
;
--在ababc中查找ab,有四个参数的时候,起始位置填写2,匹配次序填写2,即从位置2开始,查询第二次匹配的a(ab的开头是a)位置,查询不到结果,即结果为0
select instr('ababc','ab',2,2) from dual
;
--在ababc中查找ab,有四个参数的时候,起始位置填写-1,匹配次序填写1,即从位置5(-1就是从后往前查询)开始,查询第一次匹配的a(ab的开头是a)位置,即结果为3
select instr('ababc','ab',-1,1) from dual
;
--在ababc中查找ba,有四个参数的时候,起始位置填写-1,匹配次序填写1,即从位置5(-1就是从后往前查询)开始,查询第一次匹配的b(ba的开头是b)位置,即结果为1
select instr('ababc','ba',-1,1) from dual

可以根据instr函数做很多事情

比如有时候会有一些日期脏数据,格式很混乱,则就可以直接使用instr去匹配进行处理

select substr(to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),0,instr(to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),':')-3) from dual

还有like的作用,下面两个语句结果是相同的

select * from (select 'aa' as aa from dual) t where t.aa like '%a%'
;
select * from (select 'aa' as aa from dual) t where instr(t.aa,'a')>0

substr函数

通常使用substr函数有三种格式

  1. substr(字符串,起始位置)
  2. substr(字符串,起始位置,截取字符数)

实质上都是substr字符串,起始位置,截取字符数),只不过前两个参数一定要有数据,后一个参数如果不填就是默认取剩下的所有字符,无论是从前查还是从后查,执行的字符串顺序是不变的

示例:

--对abcde进行截取,使用两个参数,从第一个字符开始截取字符串剩下所有的字符,即结果为abcde
select substr('abcde',1) from dual
;
--对abcde进行截取,使用两个参数,从第三个字符开始截取字符串剩下所有的字符,即结果为cde
select substr('abcde',3) from dual
;
--对abcde进行截取,使用两个参数,从倒数第二个字符开始从前往后截取字符串剩下所有的字符,即结果为de
select substr('abcde',-2) from dual
;
--对abcde进行截取,使用三个参数,从第一个字符开始截取字符串后三个字符,即结果为abc
select substr('abcde',1,3) from dual
;
--对abcde进行截取,使用三个参数,从第二个字符开始截取字符串后五个字符,但是因为不够五个,所以就会输出剩下所有的字符,即结果为bcde
select substr('abcde',2,5) from dual
;
--对abcde进行截取,使用三个参数,从倒数第四个字符开始从前往后截取字符串后三个字符,即结果为bcd
select substr('abcde',-4,3) from dual

基本上用到了对字符串进行截取的地方就会用到substr函数,像上面说的对日期脏数据进行处理就需要用到截取字符串,就用到了substr函数

可以通过instr函数和substr函数做一个分割函数,将分割后的数据依次输出,而不是这种通过输出窗口才能看到的方法

下图为分割函数主方法,用了insrt函数,substr函数和Oracle的管道函数,管道函数具体设置见这里

具体实现部分如下:

CREATE OR REPLACE FUNCTION test_Row_pipelined(p_insvar    in varchar2,
p_delimiter in varchar2)
return test_Row_Type_TABLE
pipelined as
p_num integer := 1;
p_num1 integer;
p_length integer;
p_start integer := 1;
p_varchar varchar2(200);
ret test_Row_Type;
begin
--如果不是以分隔符结尾的,就拼接上去
select case
when (select count(1)
from dual
where p_insvar like '%' || p_delimiter) > 0 then
p_insvar
else
p_insvar || p_delimiter
end
into p_varchar
from dual;
--整个字符串的长度
select length(p_varchar) into p_length from dual;
--当起始长度大于整体长度的时候
while (p_start <= p_length) loop
--找到字符串与分隔符的分割后的下标
select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
--如果没有,则返回全部字符串,说明到了结尾了
if p_num1 = 0 then
ret := test_Row_Type(p_num,
substr(p_varchar, p_start),
p_num1,
p_start,
p_length,
0,
0); pipe row(ret);
else
--否则,截取字符传中,从p_start开始找到下标减去p_start的部分
ret := test_Row_Type(p_num,
substr(p_varchar, p_start, p_num1 - p_start),
p_num1,
p_start,
p_length,
0,
0); pipe row(ret);
--新的起始点为下标加1
p_start := p_num1 + 1; end if;
--序号加1
p_num := p_num + 1;
end loop;
return;
end;

结果如下:

【Oracle】 instr函数与substr函数以及自制分割函数的更多相关文章

  1. oracle instr函数(oracle 用instr 来代替 like)

    oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('Oracle','or') position ...

  2. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  3. Oracle字符串分割函数

    今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...

  4. Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数 关于处理小数点位数的几个oracle函数()1. 取四舍五入的几位小数select round(1.2345, 3) fr ...

  5. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  6. php中strstr、strrchr、substr、stristr四个函数的区别总结

    php中strstr.strrchr.substr.stristr四个函数的区别总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-09-22我要评论 这篇文章主要介绍了php ...

  7. php中strstr、strrchr、substr、stristr四个函数用法区别

    php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...

  8. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  9. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  10. C++常见问题: 字符串分割函数 split

    C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速分割这个问题了.列几个常用方法以备不时之需. 方法一: 利用STL自己实现split 函数(常用,简 ...

随机推荐

  1. SpringCloud之Nacos学习使用

    文章目录 Nacos 注册中心 核心功能 配置启动 集群搭建 Nacos是SpringCloudAilibaba提供的开源组件,有了Nacos我们就可以代替Eureka和SpringCloudConf ...

  2. 是时候,升级你的 Windows 了「GitHub 热点速览」

    不知道多少小伙伴用着 Windows 操作系统,可能会有一个烦恼是有时候操作系统过慢,因为众多拖慢 Windows 系统的组件.Atlas 作为一个修改版的 Windows 系统,能极大提高操作系统运 ...

  3. 2021-01-18:java中,HashMap的创建流程是什么?

    福哥答案2021-01-18: jdk1.7创建流程:三种构造器.1.初始容量不能为负数,默认16.2.初始容量大于最大容量时,初始容量等于最大容量.3.负载因子必须大于0,默认0.75.4.根据初始 ...

  4. 2021-04-20:手写代码:最小生成树算法之Prim。

    2021-04-20:手写代码:最小生成树算法之Prim. 福大大 答案2021-04-20: 解锁点,解锁边,解锁点,解锁边,一直解锁下去. 代码用golang编写.代码如下: package ma ...

  5. Selenium - 浏览器配置(1) - 忽略证书错误提示

    Selenium - 浏览器配置 忽略证书错误提示 有时候我们访问一些地址,会提示证书私密连接告警信息如下: 如果我们每次要点击高级来忽略私密连接,那就很麻烦: 在谷歌浏览器可以增加忽略证书错误问题, ...

  6. MVCC-数据库

    参考地址:看一遍就理解:MVCC原理详解 - 掘金 (juejin.cn) 1. 相关数据库知识点回顾 1.1 什么是数据库事务,为什么要有事务 事务,由一个有限的数据库操作序列构成,这些操作要么全部 ...

  7. 【python基础】基本数据类型-字符串类型

    1.初识字符串 字符串就是一系列字符.在python中,用引号括起来文本内容的都是字符串. 其语法格式为:'文本内容'或者"文本内容" 我们发现其中的引号可以是单引号,也可以是双引 ...

  8. CIO视角|平台工程带来的优势与机遇

    在当今高速发展的技术环境中,企业越来越依赖技术作为创新和竞争优势的战略驱动力.首席信息官(CIO)在企业中负责监督信息和计算机技术的管理和实施,以交付预期的业务成果.在技术是业务核心的公司中,CIO ...

  9. rust实现weatherforecast的获取天气webapi

    rust用来写webapi可能有点大材小用,但是作为入门学习应该说是不错的选择. cargo new webapi创建一个webapi项目,在src下面新建handler文件夹和models文件夹. ...

  10. Python modbus_tk 库源码分析

    modbus_tk 源代码分析 前言 modbus_tcp 协议是工业项目中常见的一种基于 TCP/IP 协议的设备数据交互协议. 作为 TCP/IP 协议的上层协议,modbus_tcp 协议涉及到 ...