2016-11-21 5 views
1

더블 해시 (##)로 구분 된 단일 열에있는 데이터를 가져 오려고합니다. 아래에서 언급 한 쿼리에 따라 6 행 대신 5 개의 레코드 만 가져올 수 있습니다.SQL 쿼리 6 행 대신 5 개의 레코드 만 반환

connectby 표현에 문제가 있다고 생각할 수 있습니다. 어떤 도움이라도 대단히 감사합니다.

create table temp (errormessage varchar2(300)) 

insert into temp errormessage values('Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##') 



WITH sample_data 
    AS (SELECT errormessage AS Error_Message 
      FROM TEMP) 
SELECT Regexp_substr(error_message, ',?([^#]*)', 1, LEVEL, 'i', 1) AS Error_Message 
FROM sample_data 
WHERE Length(Regexp_substr(error_message, ',?([^#]*)', 1, LEVEL, 'i', 1)) != 0 
CONNECT BY (Regexp_count(error_message, '#') + 1 >= LEVEL AND 
      PRIOR dbms_random.value IS NOT NULL) 
ORDER BY LEVEL 

오류 메시지는 다음과 같습니다

데이터

Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ## 

쿼리

이 시나리오를 복제 이중 해시 ##로 구분되는 하나의 레코드의 레코드 정보를 가져 오는 데 사용됩니다 분리 할 정보가있는 열. 이제 모든 데이터베이스에서이 문제를 쉽게 복제 할 수 있습니다.

+0

문제를 복제 할 수있는 충분한 정보를 게시 할 수 있습니까? 예 : TEMP 테이블과 6 INSERT 문에 대한 테이블 SQL을 생성하여 데이터를 설정 하시겠습니까? –

+0

물론 이죠, 제가 그걸 만들려고합니다 – JustCoder

+0

@ TonyAndrews 이제 시나리오를 쉽게 복제 할 수 있어야합니다. – JustCoder

답변

2

은 어쩌면 당신은 같은 후 위치 : 기존 코드

WITH sample_data AS (SELECT 1 stagging_id, 
          'A' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##' error_message 
        FROM dual UNION ALL 
        SELECT 2 stagging_id, 
          'B' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##Line7 ##' error_message 
        FROM dual) 
SELECT stagging_id, 
     status, 
     regexp_substr(error_message, '[^#]+', 1, LEVEL) err_msg 
FROM sample_data 
CONNECT BY PRIOR stagging_id = stagging_id 
      AND PRIOR sys_guid() IS NOT NULL 
      AND regexp_substr(error_message, '[^#]+', 1, LEVEL) IS NOT NULL; 

STAGGING_ID STATUS ERR_MSG 
----------- ------ -------------------------------------------------------------- 
      1 A  Line1 
      1 A  Line2 
      1 A  Line3 
      1 A  Line4 
      1 A  Line5 
      1 A  Line6 
      2 B  Line1 
      2 B  Line2 
      2 B  Line3 
      2 B  Line4 
      2 B  Line5 
      2 B  Line6 
      2 B  Line7 

문제 REGEXP_SUBSTR의 *, 플러스 구분 기호 ## 반면 당신이 # 단일 계산하고 있다는 사실이다.

당신과 같이 쿼리를 해결할 수 :

WITH sample_data AS (SELECT 1 stagging_id, 
          'A' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##' error_message 
        FROM dual UNION ALL 
        SELECT 2 stagging_id, 
          'B' status, 
          'Line1## Line2## Line3 ## Line4 ## Line5 ## Line6 ##Line7 ##' error_message 
        FROM dual) 
SELECT Regexp_substr(error_message, ',?([^#]+)', 1, LEVEL, 'i', 1) AS Error_Message 
FROM sample_dataCONNECT BY (Regexp_count(error_message, '##') >= LEVEL AND 
      PRIOR stagging_id = stagging_id AND 
      PRIOR dbms_random.value IS NOT NULL) 
ORDER BY stagging_id, LEVEL; 

ERROR_MESSAGE 
-------------------------------------------------------------- 
Line1 
Line2 
Line3 
Line4 
Line5 
Line6 
Line1 
Line2 
Line3 
Line4 
Line5 
Line6 
Line7 

참고 나는 regexp_count에 '##''#'을 REGEXP_SUBSTR의에서 +들에 *의 변화와 한 방법.

+0

나는 이런 식으로 뭔가를 찾고 있어요 : 내가 쉽게 복제에 대한 코드를 업데이트로 최신 쿼리를 사용하면보십시오 수 1 호선 라인 2 3 호선 라인 4 호선 LINE6 – JustCoder

+0

.! – JustCoder

+0

다른 행에서 line1, line2 등을 찾으십니까? 그렇다면 내 대답이 당신이 뭘하는지 알려주지 않을까요? – Boneist