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. 2020-11-24:n个物品每个物品都有一定价值,分给2个人,怎么分两个人的价值差最小?

    福哥答案2020-11-24: 背包问题:背包容量是SUM/2. 每个物体的体积是数的大小,然后尽可能的装满背包. golang代码如下: package main import ( "fm ...

  2. 2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?

    福哥答案2021-02-16: 自然智慧即可.1.普通递归.有代码.需要判断同列和斜线.2.位运算递归.有代码.3.我的递归.有代码.只需要判断斜线. 代码用golang编写,代码如下: packag ...

  3. 2022-03-14:一开始屏幕上什么也没有,粘贴板里什么也没有, 你只能在键盘上做如下4种操作中的1种: 输入:在屏幕上已经显示内容的后面加一个A, 全选:把屏幕上已经显示的全部内容选中, 复制:被

    2022-03-14:一开始屏幕上什么也没有,粘贴板里什么也没有, 你只能在键盘上做如下4种操作中的1种: 输入:在屏幕上已经显示内容的后面加一个A, 全选:把屏幕上已经显示的全部内容选中, 复制:被 ...

  4. Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

    Prompt learning 教学[技巧篇]:通过增加示例.引导词.特殊符号指令等方式让chatgpt输出更好的答案 技巧1:To Do and Not To Do 在问答场景里,为了让 AI 回答 ...

  5. vue全家桶进阶之路17:组件与组件间的通信

    在 Vue2 中,组件与组件之间的通信可以通过以下几种方式来实现: Props 和 Events 这是 Vue2 中最基础和常用的父子组件通信方式.父组件通过属性传递数据给子组件,子组件通过事件触发向 ...

  6. Jan 2023-Prioritizing Samples in Reinforcement Learning with Reducible Loss

    1 Introduction 本文建议根据样本的可学习性进行抽样,而不是从经验回放中随机抽样.如果有可能减少代理对该样本的损失,则认为该样本是可学习的.我们将可以减少样本损失的数量称为其可减少损失(R ...

  7. python -- pandas常见的一些行、列操作方法(感兴趣的,可以跟着一起练练手)

    这篇文章分享一下pandas常见的一些行.列操作方法,比较基础,感兴趣的童鞋可以看看. 首先,我们用 "random.seed(int i)" 生成一组测试数据. 对于random ...

  8. docker容器中下载vim指令的速度特别慢,解决方案

    1 首先要进入容器内执行,保存目前源 mv /etc/apt/sources.list /etc/apt/sources.list.bak 2修改源,由于docker默认没有vim的包 所以无法使用v ...

  9. jquery页面搜索关键词突出显示

    页面搜索关键词突出 // 页面搜索关键词突出 $(function () { $(".list_r").find('span').css({ // 每次搜索开始,先把所有字体颜色恢 ...

  10. 【Python&GIS】GDAL栅格转面&计算矢量面积

            GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它 ...