Oacle 쉼표 분리 문자열 split 구현

3182 단어 SQL

만약 문자열 에 쉼표 나 다른 기호 구분 이 있다 면, 'first field, second field, third field' 와 같은 열 로 나 누고 싶 습 니 다.
분해 하여 만들다
first field second field third field
첫 번 째 10G 로 시작 하 는 정규 표현 식
anbob@ANBOB>SELECT REGEXP_SUBSTR ('first field, second field , third field', '[^,]+', 1,rownum)
  2  FROM DUAL
  3  CONNECT BY ROWNUM <=
  4  LENGTH ('first field, second field , third field') - LENGTH (REPLACE ('first field, second field , third field', ',', ''))+1;

REGEXP_SUBSTR('FIRSTFIELD,SECONDFIELD,THIRDFIELD','[^,]+',1,ROWNUM)
------------------------------------------------------------------------------
first field
second field
third field

TIP: REGEXP_SUBSTR 함 수 는 그 문자열 을 '(쉼표) 로 시작 하 는 것 이 아니 라' 로 시작 하 는 것 입 니 다. 두 번 째 매개 변 수 는 몇 번 째 그룹, rownum 위조 열 번호, connect 순환, 순환 횟수 는 문자열 의 총 길이 입 니 다. - 구분자 제거 후 = 몇 개의 구분자 + 1
두 번 째 용 type, function
첫째, Type 을 만 듭 니 다.
CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000)

둘째, 함수 생 성
create or replace function split(p_list varchar2,p_sep varchar2 := ’,’)
return type_split pipelined
IS
l_idx pls_integer;
v_list varchar2(50) := 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 split;

셋째, 디 버 깅
select * from table(split(‘aaa,bbb,ccc’,',’));
열 필드 분할
anbob@ANBOB>select * from test11;

                  ID NAME
-------------------- ----------
                   1 a,b,c
                   2 e,d

nbob@ANBOB>with temp0 as (select LEVEL lv from dual CONNECT BY LEVEL <= 100)  
  2       select id,substr(t.vals,instr(t.vals, ',', 1, tv.lv) + 1,  
  3                          instr(t.vals, ',', 1, tv.lv + 1) -(  
  4                          instr(t.vals, ',', 1, tv.lv) + 1)  
  5                   ) AS name  
  6       from (select id,',' || name || ',' AS vals,  
  7                  length(name || ',') - nvl(length(REPLACE(name, ',')), 0) AS cnt  
  8             from test11) t join temp0 tv  
  9                       on  tv.lv <= t.cnt  order by 1;

                  ID NAME
-------------------- ------------------------
                   1 a
                   1 b
                   1 c
                   2 d
                   2 e

확장 regexpreplace
V 필드 의 모든 값 에 문자열 은 '00' 을 9 로 시작 하지 않 으 면 '00' 을 추가 합 니 다.
anbob@NCME>create table testreg(v varchar2(80)); Table created. anbob@NCME>insert into testreg values(’911,000,12,31′); 1 row created.
anbob@NCME>insert into testreg values(’11911,554000,312,931′); 1 row created.
anbob@NCME>commit; Commit complete.
anbob@NCME>select ltrim(regexp_replace(‘,’||v,’([,])’,'\100′),’,') newv,v from testreg;
NEWV V —————————— —————————— 00911,00000,0012,0031 911,000,12,31 0011911,00554000,00312,00931 11911,554000,312,931

좋은 웹페이지 즐겨찾기