程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle創建split和splitstr函數

Oracle創建split和splitstr函數

編輯:Oracle教程

Oracle創建split和splitstr函數


Sql語句最好依次執行創建

 

/**************************************
 * name:        split
 * author:      sean zhang.
 * date:        2012-09-03.
 * function:    返回字符串被指定字符分割後的表類型。
 * parameters:  p_list: 待分割的字符串。
                p_sep: 分隔符,默認逗號,也可以指定字符或字符串。
 * example:     select * from users where u_id in (select column_value from table (split ('1,2')))
                返回u_id為1和2的兩行數據。
 **************************************/
/* 創建一個表類型 */
create or replace type tabletype as table of varchar2(32676)

/* 創建 split 函數 */
create or replace function split (p_list clob, p_sep varchar2 := ',')
   return tabletype
   pipelined

is
   l_idx    pls_integer;
   v_list   varchar2 (32676) := p_list;
begin
   loop
      l_idx   := instr (v_list, p_sep);

      if l_idx > 0
      then
         pipe row (substr (v_list, 1, l_idx - 1));
         v_list   := substr (v_list, l_idx + length (p_sep));
      else
         pipe row (v_list);
         exit;
      end if;
   end loop;
end;



/**************************************
 * name:        splitstr
 * author:      sean zhang.
 * date:        2012-09-03.
 * function:    返回字符串被指定字符分割後的指定節點字符串。
 * parameters:  str: 待分割的字符串。
                i: 返回第幾個節點。當i為0返回str中的所有字符,當i 超過可被分割的個數時返回空。
                sep: 分隔符,默認逗號,也可以指定字符或字符串。當指定的分隔符不存在於str中時返回sep中的字符。
 * example:     select splitstr('abc,def', 1) as str from dual;  得到 abc
                select splitstr('abc,def', 3) as str from dual;  得到 空
 **************************************/
/* 創建 splitstr 函數 */
create or replace function splitstr(str in clob,
                                    i   in number := 0,
                                    sep in varchar2 := ',') return varchar2 is
  t_i     number;
  t_count number;
  t_str   varchar2(4000);
begin
  if i = 0 then
    t_str := str;
  elsif instr(str, sep) = 0 then
    t_str := sep;
  else
    select count(*) into t_count from table(split(str, sep));
  
    if i <= t_count then
      select str
        into t_str
        from (select rownum as item, column_value as str
                from table(split(str, sep)))
       where item = i;
    end if;
  end if;

  return t_str;
end;

示例:split(字符串,標識)

 

select split('a,b,c,e,d,f,g') arrData from dual;

默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;

\

點開集合

\

默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;

示例:splitstr(字符串,獲取的節點下標,分隔符)

select splitstr('X-rapido&Lemon&Jennifer', 1, '&') word from dual; -- X-rapido
select splitstr('X-rapido&Lemon&Jennifer', 2, '&') word from dual; -- Lemon
select splitstr('X-rapido&Lemon&Jennifer', 3, '&') word from dual; -- Jennifer
select splitstr('X-rapido&Lemon&Jennifer', 4, '&') word from dual; -- 空字符串

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved