最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle中instr函數(shù)與substr函數(shù)及自制分割函數(shù)詳解

 更新時(shí)間:2023年07月27日 15:28:27   作者:DbWong_0918  
這篇文章主要介紹了Oracle中instr函數(shù)與substr函數(shù)以及自制分割函數(shù),大家都知道substr函數(shù)就是很簡(jiǎn)單明了,就是個(gè)截取字符函數(shù),本文通過(guò)實(shí)例代碼對(duì)這接個(gè)函數(shù)詳細(xì)介紹,需要的朋友可以參考下

Oracle instr函數(shù)與substr函數(shù)以及自制分割函數(shù)

instr通常被用來(lái)作為判斷某個(gè)字符串中是否含有執(zhí)行字符串和將返回結(jié)果作為一些數(shù)據(jù)分割的數(shù)據(jù),即有模糊查詢like的作用,當(dāng)返回的查詢結(jié)果的序號(hào)為0的時(shí)候就是沒(méi)有匹配上

substr函數(shù)就是很簡(jiǎn)單明了,就是個(gè)截取字符函數(shù)

instr函數(shù)

通常使用instr函數(shù)有三種格式

  • instr(字符串,要匹配的字符串)
  • instr(字符串,要匹配的字符串,起始位置)
  • instr(字符串,要匹配的字符串,起始位置,匹配次序)

實(shí)質(zhì)上都是instr(字符串,要匹配的字符串,起始位置,匹配次序),只不過(guò)前兩個(gè)參數(shù)一定要有數(shù)據(jù),后兩個(gè)參數(shù)如果不填就默認(rèn)為1,無(wú)論是從前查還是從后查,執(zhí)行的字符串順序是不變的

示例

--在ababc中查找a,只有兩個(gè)參數(shù)的時(shí)候,起始位置和匹配次序默認(rèn)為1,即從位置1開(kāi)始,查詢第一次匹配的位置,即結(jié)果為1
select instr('ababc','a') from dual
;
--在ababc中查找a,只有三個(gè)參數(shù)的時(shí)候,匹配次序默認(rèn)為1,起始位置填寫2的話,即從位置2開(kāi)始,查詢第一次匹配的位置,即結(jié)果為3
select instr('ababc','a',2) from dual
;
--在ababc中查找a,有四個(gè)參數(shù)的時(shí)候,起始位置填寫1,匹配次序填寫2,即從位置1開(kāi)始,查詢第二次匹配的位置,即結(jié)果為3
select instr('ababc','a',1,2) from dual
;
--在ababc中查找a,有四個(gè)參數(shù)的時(shí)候,起始位置填寫2,匹配次序填寫2,即從位置2開(kāi)始,查詢第二次匹配的位置,查詢不到結(jié)果,即結(jié)果為0
select instr('ababc','a',2,2) from dual
;
--在ababc中查找a,有四個(gè)參數(shù)的時(shí)候,起始位置填寫-1,匹配次序填寫1,即從位置5(-1就是從后往前查詢)開(kāi)始,查詢第一次匹配的位置,即結(jié)果為3
select instr('ababc','a',-1,1) from dual
;
--在ababc中查找ab,只有兩個(gè)參數(shù)的時(shí)候,起始位置和匹配次序默認(rèn)為1,即從位置1開(kāi)始,查詢第一次匹配的a(ab的開(kāi)頭是a)位置,即結(jié)果為1
select instr('ababc','ab') from dual
;
--在ababc中查找ab,只有三個(gè)參數(shù)的時(shí)候,匹配次序默認(rèn)為1,起始位置填寫2的話,即從位置2開(kāi)始,查詢第一次匹配的a(ab的開(kāi)頭是a)位置,即結(jié)果為3
select instr('ababc','ab',2) from dual
;
--在ababc中查找ab,有四個(gè)參數(shù)的時(shí)候,起始位置填寫1,匹配次序填寫2,即從位置1開(kāi)始,查詢第二次匹配的a(ab的開(kāi)頭是a)位置,即結(jié)果為3
select instr('ababc','ab',1,2) from dual
;
--在ababc中查找ab,有四個(gè)參數(shù)的時(shí)候,起始位置填寫2,匹配次序填寫2,即從位置2開(kāi)始,查詢第二次匹配的a(ab的開(kāi)頭是a)位置,查詢不到結(jié)果,即結(jié)果為0
select instr('ababc','ab',2,2) from dual
;
--在ababc中查找ab,有四個(gè)參數(shù)的時(shí)候,起始位置填寫-1,匹配次序填寫1,即從位置5(-1就是從后往前查詢)開(kāi)始,查詢第一次匹配的a(ab的開(kāi)頭是a)位置,即結(jié)果為3
select instr('ababc','ab',-1,1) from dual
;
--在ababc中查找ba,有四個(gè)參數(shù)的時(shí)候,起始位置填寫-1,匹配次序填寫1,即從位置5(-1就是從后往前查詢)開(kāi)始,查詢第一次匹配的b(ba的開(kāi)頭是b)位置,即結(jié)果為1
select instr('ababc','ba',-1,1) from dual

可以根據(jù)instr函數(shù)做很多事情

比如有時(shí)候會(huì)有一些日期臟數(shù)據(jù),格式很混亂,則就可以直接使用instr去匹配進(jìn)行處理

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

還有l(wèi)ike的作用,下面兩個(gè)語(yǔ)句結(jié)果是相同的

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函數(shù)

通常使用substr函數(shù)有三種格式

  • substr(字符串,起始位置)
  • substr(字符串,起始位置,截取字符數(shù))

實(shí)質(zhì)上都是substr字符串,起始位置,截取字符數(shù)),只不過(guò)前兩個(gè)參數(shù)一定要有數(shù)據(jù),后一個(gè)參數(shù)如果不填就是默認(rèn)取剩下的所有字符,無(wú)論是從前查還是從后查,執(zhí)行的字符串順序是不變的

示例:

--對(duì)abcde進(jìn)行截取,使用兩個(gè)參數(shù),從第一個(gè)字符開(kāi)始截取字符串剩下所有的字符,即結(jié)果為abcde
select substr('abcde',1) from dual
;
--對(duì)abcde進(jìn)行截取,使用兩個(gè)參數(shù),從第三個(gè)字符開(kāi)始截取字符串剩下所有的字符,即結(jié)果為cde
select substr('abcde',3) from dual
;
--對(duì)abcde進(jìn)行截取,使用兩個(gè)參數(shù),從倒數(shù)第二個(gè)字符開(kāi)始從前往后截取字符串剩下所有的字符,即結(jié)果為de
select substr('abcde',-2) from dual
;
--對(duì)abcde進(jìn)行截取,使用三個(gè)參數(shù),從第一個(gè)字符開(kāi)始截取字符串后三個(gè)字符,即結(jié)果為abc
select substr('abcde',1,3) from dual
;
--對(duì)abcde進(jìn)行截取,使用三個(gè)參數(shù),從第二個(gè)字符開(kāi)始截取字符串后五個(gè)字符,但是因?yàn)椴粔蛭鍌€(gè),所以就會(huì)輸出剩下所有的字符,即結(jié)果為bcde
select substr('abcde',2,5) from dual
;
--對(duì)abcde進(jìn)行截取,使用三個(gè)參數(shù),從倒數(shù)第四個(gè)字符開(kāi)始從前往后截取字符串后三個(gè)字符,即結(jié)果為bcd
select substr('abcde',-4,3) from dual

基本上用到了對(duì)字符串進(jìn)行截取的地方就會(huì)用到substr函數(shù),像上面說(shuō)的對(duì)日期臟數(shù)據(jù)進(jìn)行處理就需要用到截取字符串,就用到了substr函數(shù)

可以通過(guò)instr函數(shù)和substr函數(shù)做一個(gè)分割函數(shù),將分割后的數(shù)據(jù)依次輸出,而不是這種通過(guò)輸出窗口才能看到的方法(見(jiàn)文末介紹oracle 在PL/SQL將字符串分割輸出)

下圖為分割函數(shù)主方法,用了insrt函數(shù),substr函數(shù)和Oracle的管道函數(shù),管道函數(shù)具體設(shè)置見(jiàn)這里

具體實(shí)現(xiàn)部分如下:

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
  --如果不是以分隔符結(jié)尾的,就拼接上去
  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;
  --整個(gè)字符串的長(zhǎng)度
  select length(p_varchar) into p_length from dual;
  --當(dāng)起始長(zhǎng)度大于整體長(zhǎng)度的時(shí)候
  while (p_start <= p_length) loop
    --找到字符串與分隔符的分割后的下標(biāo)
    select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
    --如果沒(méi)有,則返回全部字符串,說(shuō)明到了結(jié)尾了
    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開(kāi)始找到下標(biāo)減去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);
     --新的起始點(diǎn)為下標(biāo)加1
      p_start := p_num1 + 1;
    end if;
    --序號(hào)加1
    p_num := p_num + 1;
  end loop;
  return;
end;

結(jié)果如下:

oracle 在PL/SQL將字符串分割輸出

示例如下:

declare
begin
	for maina in (select tt.line ll
                                  from (select regexp_substr('a,b,c,d', '[^,]+',1,level) line
                                          from dual bd
                                        connect by level <= regexp_count('a,b,c,d', ',') + 1) tt
                                 where rownum <= regexp_count('a,b,c,d', ',') + 1)loop														 
	dbms_output.put_line('分割后的字符:' || maina.ll);		
	end loop;
	end;

結(jié)果:

到此這篇關(guān)于Oracle中instr函數(shù)與substr函數(shù)以及自制分割函數(shù)的文章就介紹到這了,更多相關(guān)oracle instr函數(shù)與substr函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Oracle數(shù)據(jù)庫(kù)中的控制文件管理以及常用參數(shù)設(shè)置

    Oracle數(shù)據(jù)庫(kù)中的控制文件管理以及常用參數(shù)設(shè)置

    這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中的控制文件管理以及常用參數(shù)設(shè)置方法,包括控制文件不一致問(wèn)題的解決方法以及隱藏參數(shù)等技巧,需要的朋友可以參考下
    2015-12-12
  • Oracle中sys和system的區(qū)別小結(jié)

    Oracle中sys和system的區(qū)別小結(jié)

    SYS用戶具有DBA權(quán)限,并且擁有SYS模式,只能通過(guò)SYSDBA登陸數(shù)據(jù)庫(kù)。是Oracle數(shù)據(jù)庫(kù)中權(quán)限最高的帳號(hào) SYSTEM具有DBA權(quán)限。但沒(méi)有SYSDBA權(quán)限。平常一般用該帳號(hào)管理數(shù)據(jù)庫(kù)就可以了。
    2009-11-11
  • Oracle變更redo log文件位置的操作步驟

    Oracle變更redo log文件位置的操作步驟

    重做日志文件 redo log file 通常也稱為日志文件,它是保證數(shù)據(jù)庫(kù)安全和數(shù)據(jù)庫(kù)備份與恢復(fù)的文件,是數(shù)據(jù)庫(kù)安全和恢復(fù)的最基本的保障,本文小編給大家介紹了Oracle變更redo log文件位置的操作步驟,需要的朋友可以參考下
    2025-02-02
  • Oracle層次查詢和with函數(shù)的使用示例

    Oracle層次查詢和with函數(shù)的使用示例

    下面我跟大家分享下我的心得,也就是基于這種設(shè)計(jì)怎么做數(shù)形圖,簡(jiǎn)單的做法就是查詢出一個(gè)list集合就可以,要怎么辦呢先來(lái)看下我的數(shù)據(jù)表
    2013-07-07
  • oracle查所有表的索引個(gè)數(shù)的示例代碼

    oracle查所有表的索引個(gè)數(shù)的示例代碼

    本文主要介紹了oracle查所有表的索引個(gè)數(shù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • Oracle Database Server ''TNS Listener''遠(yuǎn)程數(shù)據(jù)投毒漏洞(CVE-2012-1675)的完美解決方法

    Oracle Database Server ''TNS Listener''遠(yuǎn)程數(shù)據(jù)投毒漏洞(CVE-2012-167

    這篇文章主要介紹了Oracle Database Server 'TNS Listener'遠(yuǎn)程數(shù)據(jù)投毒漏洞(CVE-2012-1675的完美解決方法的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • Oracle自動(dòng)備份腳本

    Oracle自動(dòng)備份腳本

    這篇文章主要介紹了Oracle自動(dòng)備份腳本的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Oracle中插入特殊字符:&和'的解決方法匯總

    Oracle中插入特殊字符:&和'的解決方法匯總

    這篇文章主要介紹了Oracle中插入特殊字符:&amp;和&#39;的解決方法,很有實(shí)用價(jià)值!需要的朋友可以參考下
    2014-07-07
  • Oracle數(shù)據(jù)庫(kù)執(zhí)行計(jì)劃的查看與分析技巧

    Oracle數(shù)據(jù)庫(kù)執(zhí)行計(jì)劃的查看與分析技巧

    在 Oracle 數(shù)據(jù)庫(kù)中,執(zhí)行計(jì)劃能夠幫助我們深入了解 SQL 語(yǔ)句在數(shù)據(jù)庫(kù)內(nèi)部的執(zhí)行細(xì)節(jié),進(jìn)而優(yōu)化查詢性能、提升系統(tǒng)效率,執(zhí)行計(jì)劃是 Oracle 數(shù)據(jù)庫(kù)優(yōu)化器為 SQL 語(yǔ)句生成的一種執(zhí)行藍(lán)圖,本文給大家介紹了Oracle數(shù)據(jù)庫(kù)執(zhí)行計(jì)劃的查看與分析技巧,需要的朋友可以參考下
    2024-12-12
  • Oracle用戶密碼設(shè)為不過(guò)期的兩種方法

    Oracle用戶密碼設(shè)為不過(guò)期的兩種方法

    這篇文章主要介紹了Oracle用戶密碼設(shè)為不過(guò)期的兩種方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12

最新評(píng)論

沙田区| 泗阳县| 元氏县| 尼玛县| 汶上县| 双流县| 北京市| 卫辉市| 康乐县| 中牟县| 婺源县| 桃园县| 连州市| 威海市| 南宫市| 田阳县| 芜湖市| 新野县| 武定县| 钟山县| 凤城市| 渭源县| 肥城市| 都兰县| 宜州市| 女性| 巴南区| 株洲市| 桐城市| 盈江县| 北安市| 织金县| 池州市| 台北市| 肇源县| 加查县| 湘西| 常州市| 天峨县| 白水县| 右玉县|