2014-03-26 2 views
0

나는 비슷한 질문을 stackoverflow 주위에 본 적이 있지만 아직 단 하나의 열을 speecifically 거래 --- 나는 행당 여러 단어가있는 열이 있습니다. 단어가 #로 분리되도록 행을 설정했습니다. 이제 문자열을 파싱하고 행당 하나의 단어 만 있도록 문자열을 원합니다.행 당 1 단어로 긴 문자열이 분할 된 열 SQL

TEST 
--------------------------------------------- 
SPOKE#WITH#MR#SMITHS#ASSISTANT 
MRS#MOODY#REFUSED#A#VISIT 
SCHEDULING#OFFICE#LEFT#A#MESSAGE#FOR#VISIT 
LEFT#A#MESSAGE#FOR#VISIT 
SCHEDULING#OFFICE#SCHEDULED#AN#APPOINTMENT#FOR#DR#JOHNSON 
PHONE#CALL 
--------------------------------------------- 

과 나는 같은 것을보고 그것을 좋아하는 것 : 이러한 유형의 쿼리에

TEST 
------------------- 
SPOKE 
WITH 
MR 
SMITHS 
ASSISTANT 
MRS 
MOODY 
REFUSED 
A 
VISIT 
SCHEDULING 
OFFICE 
LEFT 
etc... etc... etc... 
------------------- 

나는 비교적 새로운 해요을 여기에 열이 현재 (현재 약 1500 행) 모습입니다 그래서 당신이 나를 가리킬 수있는 자습서 나 문서도 도움이 될 것입니다. OracleSQL과 함께 TOAD를 사용하고 있습니다. 고맙습니다.

답변

2

당신이 오라클 PL/SQL의 영역에 있으니 REGULAR EXPRESSIONS이라는 유용한 기능 집합이 있습니다. 작은 문자열로 분할 구분 된 문자열은 다음의 예와 같이 REGEXP_SUBSTR 기능의 범주에 맞아야

EDIT :은 감독을 발견 : 구분 된 시리즈의 마지막 번호는 출력에서 ​​제외된다. 구분 기호의 수는 계열의 요소 수보다 1 작습니다 ... LOOP 반복 수가 업데이트되었습니다.

쿼리 데모

DECLARE 
    x varchar2(100); 
    y pls_integer; 
    z pls_integer; 
    c VARCHAR2(40) := '1:3:4:6:8:10:3:4:7:6:11:12'; 
BEGIN 
    y := length(c) - length(replace(c,':')); 
    if y > 0 then 
     for z in 1 .. (y+1) loop 
     x := REGEXP_SUBSTR(c,'[^:]+', 1, z); 
     dbms_output.put_line(x); 

     end loop; 
     x :- REGEXP_SUBSTR(c,'[ 
    end if; 
end; 

아웃풋 : 영업의 예를 사용

1 
3 
4 
6 
8 
10 
3 
4 
7 
6 
11 

Statement processed. 

0.01 seconds 

 DECLARE 
     cursor str_cursor is 
      select string_val 
      from test_split_string; 

     x varchar2(100); 
     y pls_integer; 
     z pls_integer; 
     BEGIN 
     for n in str_cursor loop 
      y := length(n.string_val) - length(replace(n.string_val,'#')); 
      for z in 1 .. (y+1) loop  
       x := REGEXP_SUBSTR(n.string_val,'[^#]+', 1, z); 
       dbms_output.put_line(x); 
      end loop; 
     end loop; 
     end; 

결과

MRS MOODY REFUSED A SCHEDULING OFFICE LEFT A MESSAGE FOR LEFT A MESSAGE FOR SPOKE WITH MR ETC... ETC... ETC... 

예 2

에서 용어 ORACLE REGULAR EXPRESSIONS에 검색 가능한 추가 기능을 문서화하는 좋은 웹 자원을 산출한다.

+0

매우 자세히 ... 고맙습니다 ... 나는 각 단어에 대한 새로운 행을 만드는 방법과 가장 혼동스러워 보였습니다. 일반적인 프로그래밍 구문을 사용하여 논리를 만들 수 있다는 것을 알지 못했습니다. 이러한 유형의 매크로를 작성하는 일부 연구 – Ted

+0

감사! 나는 당신이 아마도'SQL' 프로그래밍 언어의 제약 하에서 문제에 접근하려고 시도했기 때문에 나는 조금 (속임수로) 생각할 것입니다. 이 스 니펫은 순수 SQL에서 수행되면 더 길어질 수 있습니다 ... 여전히 가능합니다 ... 그냥 지저분합니다. 'ORACLE' 환경에서 작업하고 있기 때문에 표준 데이터베이스 쿼리 언어 기능에 프로 시저 로직 및 처리 단계를 사용할 수있게 해주는 Oracle의 사용자 정의 확장 (PL/SQL)을 사용할 수 있습니다. 즐겨! –