1. 程式人生 > >Oracle中instr、substr函式的使用和split功能的實現

Oracle中instr、substr函式的使用和split功能的實現

substr(str,index1,n)
取字串str,位置index1後面的n個字元,index1取1或0都代表第一個字元。
instr(str,sub,dire,times)
獲取字串str,的子串sub的位置。dire取1代表從左到右找,dire取-1代表從右到左找。times代表找第幾個。如果times超出範圍,函式返回0。

用法對比如下:
substr


    
  1. SELECT
    'substr(''abcdefghi'',1,4)' FUN, substr( 'abcdefghi', 1, 4) RESULT FROM dual union all
  2. SELECT 'substr(''abcdefghi'',0,4)' FUN, substr( 'abcdefghi'
    , 0, 4) RESULT FROM dual union all
  3. SELECT 'substr(''abcdefghi'',2,4)' FUN, substr( 'abcdefghi', 2, 4) RESULT FROM dual ;

instr

    
  1. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', 1, 1) RESULT FROM DUAL UNION ALL
  2. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', 1, 2) RESULT FROM DUAL UNION ALL
  3. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', -1, 1) RESULT FROM DUAL UNION ALL
  4. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', -1, 2) RESULT FROM DUAL;


PL/SQL沒有split函式,要使用split函式的時候需要自己寫一個。我自己寫了一個oracle函式,如下:

    
  1. create or replace function SPLITER(p_value varchar2 ,
  2. p_split varchar2 := ',' ,times integer := 1)
  3. --引數1 表示字串,引數2 為分隔符,引數3 為第幾個
  4. return varchar2 as
  5. v_idx1 integer;
  6. v_idx2 integer;
  7. v_strs_last varchar2(4000 ) := p_value;
  8. begin
  9. if times= 1 then
  10. return substr(v_strs_last, 1 , instr(v_strs_last,p_split, 1, 1) -1 );
  11. end if;
  12. v_idx1 := instr(v_strs_last, p_split, 1,times-1 );
  13. v_idx2 := instr(v_strs_last, p_split, 1,times);
  14. if v_idx2= 0 then
  15. return substr(v_strs_last,v_idx1+1 );
  16. end if;
  17. return substr(v_strs_last,v_idx1+ 1,v_idx2-v_idx1-1 );
  18. end SPLITER;
效果如下:

    
  1. SELECT 'spliter(''111,222,333,444,555'','','',1)' fun,spliter( '111,222,333,444,555', ',', 1) result FROM dual union all
  2. SELECT 'spliter(''111,222,333,444,555'','','',2)' fun,spliter( '111,222,333,444,555', ',', 2) result FROM dual union all
  3. SELECT 'spliter(''111,222,333,444,555'','','',3)' fun,spliter( '111,222,333,444,555', ',', 3) result FROM dual union all
  4. SELECT 'spliter(''111,222,333,444,555'','','',4)' fun,spliter( '111,222,333,444,555', ',', 4) result FROM dual union all
  5. SELECT 'spliter(''111,222,333,444,555'','','',5)' fun,spliter( '111,222,333,444,555', ',', 5) result FROM dual union all
  6. SELECT 'spliter(''111,222,333,444,555'','','',6)' fun,spliter( '111,222,333,444,555', ',', 6) result FROM dual;










substr(str,index1,n)
取字串str,位置index1後面的n個字元,index1取1或0都代表第一個字元。
instr(str,sub,dire,times)
獲取字串str,的子串sub的位置。dire取1代表從左到右找,dire取-1代表從右到左找。times代表找第幾個。如果times超出範圍,函式返回0。

用法對比如下:
substr


  
  1. SELECT 'substr(''abcdefghi'',1,4)' FUN, substr( 'abcdefghi', 1, 4) RESULT FROM dual union all
  2. SELECT 'substr(''abcdefghi'',0,4)' FUN, substr( 'abcdefghi', 0, 4) RESULT FROM dual union all
  3. SELECT 'substr(''abcdefghi'',2,4)' FUN, substr( 'abcdefghi', 2, 4) RESULT FROM dual ;

instr

  
  1. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', 1, 1) RESULT FROM DUAL UNION ALL
  2. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', 1, 2) RESULT FROM DUAL UNION ALL
  3. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', -1, 1) RESULT FROM DUAL UNION ALL
  4. SELECT 'INSTR(''ABCABCABCABC'',''A'',1,1)' FUN, INSTR( 'ABCABCABCABC', 'A', -1, 2) RESULT FROM DUAL;


PL/SQL沒有split函式,要使用split函式的時候需要自己寫一個。我自己寫了一個oracle函式,如下:

  
  1. create or replace function SPLITER(p_value varchar2 ,
  2. p_split varchar2 := ',' ,times integer := 1)
  3. --引數1 表示字串,引數2 為分隔符,引數3 為第幾個
  4. return varchar2 as
  5. v_idx1 integer;
  6. v_idx2 integer;
  7. v_strs_last varchar2(4000 ) := p_value;
  8. begin
  9. if times= 1 then
  10. return substr(v_strs_last, 1 , instr(v_strs_last,p_split, 1, 1) -1 );
  11. end if;
  12. v_idx1 := instr(v_strs_last, p_split, 1,times-1 );
  13. v_idx2 := instr(v_strs_last, p_split, 1,times);
  14. if v_idx2= 0 then
  15. return substr(v_strs_last,v_idx1+1 );
  16. end if;
  17. return substr(v_strs_last,v_idx1+ 1,v_idx2-v_idx1-1 );
  18. end SPLITER;
效果如下:

  
  1. SELECT 'spliter(''111,222,333,444,555'','','',1)' fun,spliter( '111,222,333,444,555', ',', 1) result FROM dual union all
  2. SELECT 'spliter(''111,222,333,444,555'','','',2)' fun,spliter( '111,222,333,444,555', ',', 2) result FROM dual union all
  3. SELECT 'spliter(''111,222,333,444,555'','','',3)' fun,spliter( '111,222,333,444,555', ',', 3) result FROM dual union all
  4. SELECT 'spliter(''111,222,333,444,555'','','',4)' fun,spliter( '111,222,333,444,555', ',', 4) result FROM dual union all
  5. SELECT 'spliter(''111,222,333,444,555'','','',5)' fun,spliter( '111,222,333,444,555', ',', 5) result FROM dual union all
  6. SELECT 'spliter(''111,222,333,444,555'','','',6)' fun,spliter( '111,222,333,444,555', ',', 6) result FROM dual;