복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    5.사용 크로스 조인

    사용 크로스 조인

    SELECT 번호, SiteNumber Sitetable FROM CROSS는 ( ','사이트) STRING_SPLIT을 적용;

  6. from https://stackoverflow.com/questions/3713107/split-column-to-multiple-rows by cc-by-sa and MIT license