오라클 SQL 문의 (개행된 데이터의 값을 Row로) 1 5 552

by 오라오라 [SQL Query] [2022.01.12 13:18:05]


SQL 작성이 잘 되지 않아 문의드립니다

현재 데이터는 아래와 같습니다

테이블명 엔터티명 메시지
TAB1 테이블1 warring (code 123) for column "컬럼1" at row 101
warring (code 123) for column "컬럼1" at row 102
warring (code 123) for column "컬럼3" at row 103
TAB2 테이블2 error (code 123) for column "컬럼1" at row 102
TAB3 테이블3 warring (code 123) for column "컬럼2" at row 11
warring (code 123) for column "컬럼2" at row 12

 

위 데이터를 아래와 같이 출력하고 싶습니다

테이블명 엔터티명 오류코드 오류컬럼 오류 ROW
TAB1 테이블1 123 컬럼1 101
TAB1 테이블1 123 컬럼1 102
TAB1 테이블1 123 컬럼3 103
TAB2 테이블2 456 컬럼1 102
TAB3 테이블3 123 컬럼2 11
TAB3 테이블3 123 컬럼2 12

 

by 마농 [2022.01.12 14:23:45]
WITH t AS
(
SELECT 'TAB1' t_nm, '테이블1' e_nm, 'warring (code 123) for column "컬럼1" at row 101
warring (code 123) for column "컬럼1" at row 102
warring (code 123) for column "컬럼3" at row 103' msg FROM dual
UNION ALL SELECT 'TAB2', '테이블2', 'error (code 123) for column "컬럼1" at row 102' FROM dual
UNION ALL SELECT 'TAB3', '테이블3', 'warring (code 123) for column "컬럼2" at row 11
warring (code 123) for column "컬럼2" at row 12' FROM dual
)
SELECT t_nm
     , e_nm
     , lv
     , SUBSTR(REGEXP_SUBSTR(msg,   'code [0-9]+', 1, lv), 6) err_cod
     , SUBSTR(REGEXP_SUBSTR(msg, 'column "[^"]+', 1, lv), 9) err_col
     , SUBSTR(REGEXP_SUBSTR(msg,    'row [0-9]+', 1, lv), 5) err_row
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(msg, 'row')
 ORDER BY t_nm, lv
;

 


by 오라오라 [2022.01.12 14:43:54]

선 감사합니다 ~


by 오라오라 [2022.01.13 09:14:43]

죄송하지만 1가지만 더 문의드리고 싶습니다

결과에서 해당하는 데이터(메시지 속성)도 출력하고 싶은데 잘 안되어서요..

예를 들면 아래와 같습니다

테이블명 엔터티명 오류코드 오류컬럼 오류 ROW 메시지
TAB1 테이블1 123 컬럼1 101 warring (code 123) for column "컬럼1" at row 101
TAB1 테이블1 123 컬럼1 102 warring (code 123) for column "컬럼1" at row 102
TAB1 테이블1 123 컬럼3 103 warring (code 123) for column "컬럼3" at row 103

by 마농 [2022.01.13 09:41:31]
WITH t AS
(
SELECT 'TAB1' t_nm, '테이블1' e_nm, 'warring (code 123) for column "컬럼1" at row 101
warring (code 123) for column "컬럼1" at row 102
warring (code 123) for column "컬럼3" at row 103' msg FROM dual
UNION ALL SELECT 'TAB2', '테이블2', 'error (code 123) for column "컬럼1" at row 102' FROM dual
UNION ALL SELECT 'TAB3', '테이블3', 'warring (code 123) for column "컬럼2" at row 11
warring (code 123) for column "컬럼2" at row 12' FROM dual
)
SELECT t_nm
     , e_nm
     , lv
     , RTRIM (REGEXP_SUBSTR(msg,   '.+ \(', 1, lv), ' (')    err_gbn
     , SUBSTR(REGEXP_SUBSTR(msg,   'code [0-9]+', 1, lv), 6) err_cod
     , SUBSTR(REGEXP_SUBSTR(msg, 'column "[^"]+', 1, lv), 9) err_col
     , SUBSTR(REGEXP_SUBSTR(msg,    'row [0-9]+', 1, lv), 5) err_row
     , REGEXP_SUBSTR(msg, '.+', 1, lv) msg
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(msg, 'row')
 ORDER BY t_nm, lv
;

 


by 오라오라 [2022.01.13 09:55:10]

와 정말 감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입