设为首页 收藏本站
查看: 1025|回复: 0

[经验分享] Oracle 创建 split 和 splitstr 函数

[复制链接]

尚未签到

发表于 2017-12-10 14:39:51 | 显示全部楼层 |阅读模式
  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;
DSC0000.png

  点开集合
DSC0001.png

  默认使用逗号分割,可以自定义修改,如: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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422688-1-1.html 上篇帖子: ORACLE 报错ORA-00600:内部错误代码,参数:[kcratr_nab_less_than_odr][],[],[] 下篇帖子: Oracle 多行、多列子查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表