ITPub博客

首页 > 数据库 > Oracle > oracle一列拆分为多列

oracle一列拆分为多列

原创 Oracle 作者:abin1703 时间:2022-09-26 13:39:24 0 删除 编辑

数据如上图所示


需要将数据name 按照空格进行炒粉多列


1、首先判断name列最长的空格个数是多少:

 select max(length(regexp_replace(name,'[^ ]+',''))) from czx;

可见,最长的空格个数是8,那么我们就创造如下sql:



select id, f_new_rowit(name, ' ', 1) v1, f_new_rowit(name, ' ', 2) v2, f_new_rowit(name, ' ', 3) v3, 
f_new_rowit(name, ' ', 4) v4, f_new_rowit(name, ' ', 5) v5, f_new_rowit(name, ' ', 6) v6, 
f_new_rowit(name, ' ', 7) v7, f_new_rowit(name, ' ', 8) v8,age from czx ;


在oracle用户下创建函数f_new_rowit:

create or replace function f_new_rowit(in_text varchar2,--要截取的字符串
                                       fh      varchar2,--截取识别符号
                                       n       number)--按第几个符号截取
                                        return varchar2 is
  Result varchar2(4000);
begin
  if n > 1 then
    SELECT substr(in_text,
                  
                  decode(instr(in_text, fh, n - 1, n - 1),
                         0,
                         0,
                         instr(in_text, fh, n - 1, n - 1) + 1),
                  
                  decode(sign(instr(in_text, fh, n, n) -
                              instr(in_text, fh, n - 1, n - 1)),
                         1,
                         (instr(in_text, fh, n, n) -
                         instr(in_text, fh, n - 1, n - 1)) - 1,
                         -1,
                         length(in_text),
                         0,
                         0)
                  
                  )
      into Result
      FROM dual;
  else
    select substr(in_text, 0, instr(in_text, fh, 1, 1) - 1)
      into Result
      from dual;
  end if;
  return(Result);
end f_new_rowit;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30345407/viewspace-2916179/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-07-13

  • 博文量
    204
  • 访问量
    426853