oracle一列拆分為多列

abin1703發表於2022-09-26

資料如上圖所示


需要將資料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部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2916179/,如需轉載,請註明出處,否則將追究法律責任。

相關文章