구분자로 문자열 구분하는 쿼리에 대해서 궁금한게 있습니다. 0 1 4,644

by BananaCat [SQL Query] 쿼리 [2013.03.14 18:01:58]


밑의 쿼리는 마눙님이 예전에 올려주신
구분자로 문자열 분할하는 쿼리인데요.

WITH t AS
(
SELECT 'TEST1,TEST2,TEST3,TEST4' col1, 'kim1' user_id FROM dual
UNION ALL SELECT 'APP123', 'Lee1' FROM dual
UNION ALL SELECT 'HAHAHA1', 'Park1' FROM dual
)
SELECT user_id
, lv
, REGEXP_SUBSTR(col1, '[^,]+', 1, lv) col
FROM t
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9) c
WHERE lv <= LENGTH(col1) - LENGTH(REPLACE(col1, ',')) + 1
ORDER BY user_id, lv
;

이해가 잘 안되는 부분이 있어서요
CONNECT BY LEVEL 에서 9의 의미랑
REGEXP_SUBSTR 에서 '[^.]+'를 수정하면 결과가 이상하게 나오던데
아시는 분 있으시면 설명좀 부탁드립니다.

좋은하루되세요~.

by 마농 [2013.03.15 08:27:33]

SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9
이 부분만 따로 실행해 보세요.
1부터 9까지 9건의 행이 생성됩니다.
원래 데이터를 복제하기 위한 용도로 사용할 집합이구요.
구분자로 구별되는 데이터가 9개 이상 나오지 않는다고 가정하고 9 라는 숫자를 준 것입니다.
원본테이블(3건)과 이 9건의 집합을 조건없이 조인하면
3 * 9 = 27건의 자료가 생성되는데
WHERE lv <= LENGTH(col1) - LENGTH(REPLACE(col1, ',')) + 1
이 조건을 주면 각 데이터별 구분자의 갯수 + 1 만큼만 복제합니다.
REGEXP_SUBSTR(col1, '[^,]+', 1, lv)
이 부분은 정규표현식을 이용해 데이터를 잘라내는 구문입니다.
[^,] 이부분은 컴마가 아닌문자를 의미하구요
[^,]+  플러스를 붙이면 하나 이상을 의미합니다.
1, lv 이부분은 첫번째 문자부터 검색해서 lv 번째 검색되는 문자를 찾으라는 거구요
여기서 lv 는 1 부터 차례로 증가하는 수죠.
첫번쨰 데이터 'TEST1,TEST2,TEST3,TEST4' 를 예를 들면
컴마가 총 3개이므로 4건이 복제되어 lv 는 1,2,3,4 가 나오게 되구요
컴마가 아닌 연속문자열을 차례대로 찾아 Substr 하게 됩니다.
REGEXP_SUBSTR('TEST1,TEST2,TEST3,TEST4', '[^,]+', 1, 1) ==> 'TEST1'
REGEXP_SUBSTR('TEST1,TEST2,TEST3,TEST4', '[^,]+', 1, 2) ==> 'TEST2'
REGEXP_SUBSTR('TEST1,TEST2,TEST3,TEST4', '[^,]+', 1, 3) ==> 'TEST3'
REGEXP_SUBSTR('TEST1,TEST2,TEST3,TEST4', '[^,]+', 1, 4) ==> 'TEST4'

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