[SQL] 여러 행에 분할 열
SQL여러 행에 분할 열
여러 개의 값은 쉼표로 구분 (,) 내가 자신의 행에 있지만 앞에 동일한 번호로 earch 사이트를 얻을 수 있도록 분할하고 싶은 포함하는 열이있는 테이블이 있습니다.
내 선택이 입력에서 것 그래서
table Sitetable
Number Site
952240 2-78,2-89
952423 2-78,2-83,8-34
이 출력을 생성
Number Site
952240 2-78
952240 2-89
952423 2-78
952423 2-83
952423 8-34
나는 일을하지만, 아니 것이라고 생각하는 것이 무엇인가를 발견 ..
select Number, substr(
Site,
instr(','||Site,',',1,seq),
instr(','||Site||',',',',1,seq+1) - instr(','||Site,',',1,seq)-1) Site
from Sitetable,(select level seq from dual connect by level <= 100) seqgen
where instr(','||Site,',',1,seq+1) > 0
EDIT2 : 내가 실제로 일부의 작업은 항상 (내가 :( 시시한 테스터이었다)을 선택했다 것을 볼, 하나 작동하지만 유일한 문제 위는 지난 사이트 값을 푼다하지만 아픈에 약간의 일을하려고한다는 것입니다 그..
EDIT3 : 지금은 작업
select Number, substr(
Site,
instr(','||Site,',',1,seq),
instr(','||Site||',',',',1,seq+1) - instr(','||Site,',',1,seq)-1) Site
from Sitetable,(select level seq from dual connect by level <= 100) seqgen
where instr(','||Site,',',1,seq) > 0
해결법
-
==============================
1.그리고 정답입니다.
그리고 정답입니다.
select Number, substr( Site, instr(','||Site,',',1,seq), instr(','||Site||',',',',1,seq+1) - instr(','||Site,',',1,seq)-1) Site from Sitetable,(select level seq from dual connect by level <= 100) seqgen where instr(','||Site,',',1,seq) > 0
-
==============================
2.당신은 오라클 9i의 최고의 분할 CSV 문자열에 대한 방법 마이클 Sofaer의 답변을 시도 했
당신은 오라클 9i의 최고의 분할 CSV 문자열에 대한 방법 마이클 Sofaer의 답변을 시도 했
create or replace function splitter_count(str in varchar2, delim in char) return int as val int; begin val := length(replace(str, delim, delim || ' ')); return val - length(str); end; create type token_list is varray(100) of varchar2(200); CREATE or replace function tokenize (str varchar2, delim char) return token_list as ret token_list; target int; i int; this_delim int; last_delim int; BEGIN ret := token_list(); i := 1; last_delim := 0; target := splitter_count(str, delim); while i <= target loop ret.extend(); this_delim := instr(str, delim, 1, i); ret(i):= substr(str, last_delim + 1, this_delim - last_delim -1); i := i + 1; last_delim := this_delim; end loop; ret.extend(); ret(i):= substr(str, last_delim + 1); return ret; end;
-
==============================
3.------------ 결과 테이블을 작성 ----------------------------------- --------
------------ 결과 테이블을 작성 ----------------------------------- --------
(표 resulTable를 만들
숫자 번호,
사이트 VARCHAR2 (1000)
);
------------ 분배기 절차를 작성 ----------------------------------- ---
사용하는 2-78 s2ss78s의 : / 여기를 나는 예를 들어 번호를 대체 DBMS_UTILITY.comma_to_table (이 숫자에서 작동하지 않습니다) /
만들거나 같은 절차 split_list_to_rows (NUM 번호, PLIST VARCHAR2를) 대체
ptablen BINARY_INTEGER;
파이프 라인 코어 DBMS_UTILITY.uncl_array;
시작
DBMS_UTILITY.comma_to_table (
목록 => 대체 (( 'S', PLIST) (CONCAT 교체, ',', 's'에), '-', 'SS')
manyTable => ptablen,
탭 => 파이프 라인 코어);
I IN 1 .. ptablen LOOP FOR
INSERT INTO resulTable의 VALUES (NUM 대체 (LTRIM (파이프 라인 코어 (I), 'S'), 'SS', '-'));
END LOOP;
종료;
------------ PL / SQL 블록은 각 행에 대해 절차를 실행하려면 -------------------
시작
대한의 전 (선택 번호, 사이트 표에서 사이트)
고리
split_list_to_rows (i.cnumber, i.Site);
루프를 종료;
종료;
------------------------ 결과를 참조 ----------------------- ----------------
resulTable에서 *를 선택;
-
==============================
4.나는 귀하의 경우 아마도하지만, 불필요한 100 쉼표로 구분 된 값의 최대 한계가 피해를주지 않을 생각합니다.
나는 귀하의 경우 아마도하지만, 불필요한 100 쉼표로 구분 된 값의 최대 한계가 피해를주지 않을 생각합니다.
대신에
from Sitetable,(select level seq from dual connect by level <= 100)
이 값은 임의의 수 (본 쉼표의 최대 수에 의해 제한 레벨)에 대해 작동한다.
from Sitetable,(select level seq from dual connect by level <= (select max((LENGTH(site)-LENGTH(REPLACE(site,',', '' ))) + 1) from sitetable)
-
==============================
5.사용 크로스 조인
사용 크로스 조인
SELECT 번호, SiteNumber Sitetable FROM CROSS는 ( ','사이트) STRING_SPLIT을 적용;
from https://stackoverflow.com/questions/3713107/split-column-to-multiple-rows by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 그것은 오라클의 매개 변수로 테이블 이름을 통과 할 수 있습니까? (0) | 2020.06.15 |
---|---|
[SQL] 윈도우 함수 또는 공통 테이블 표현식 : 범위 내에서 이전 행을 계산 (0) | 2020.06.15 |
[SQL] OPENROWSET와 Excel로 SQL 서버 수출 (0) | 2020.06.15 |
[SQL] 오라클 동적 피벗 (0) | 2020.06.15 |
[SQL] 하나 또는 여러 개의 데이터베이스 (0) | 2020.06.15 |