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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.