안녕하세요
아래 쿼리를 돌려보면 당연히 콤마로 잘라서 행으로 보여줍니다.
그런데 기준 데이터가 여러행일경우 하나씩 더 나오게 되는데요..
그래서 전체를 다시 group by 하면 정리는 되는데 쿼리 수행시간이 꽤 걸립니다.
혹시 group by 없이 딱, A,B,a,b가 행으로 4개만 나오게 할 수 있을까요?
SELECT key
,col
,regexp_substr(col, '[^,]+', 1, LEVEL) col2
FROM (SELECT 1 key
,'A,B' col
FROM dual
UNION
SELECT 2 key
,'a,b' col
FROM dual) a
CONNECT BY regexp_substr(col, '[^,]+', 1, LEVEL) IS NOT NULL
ORDER BY a.key
,LEVEL;
SELECT key ,col ,regexp_substr(col, '[^,]+', 1, LV) col2 FROM (SELECT 1 key ,'A,B' col FROM dual UNION SELECT 2 key ,'a,b' col FROM dual) a ,(SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 10) WHERE regexp_substr(col, '[^,]+', 1, LV) IS NOT NULL ;
COL의 문자가 최대 10개라 본 것 입니다.
그 이상되면 위 LEVEL <= 10의 숫자를 원하시는 크기로 늘리시면 됩니다.
WITH
W_DATA(KEY, COLS) AS
(
SELECT 1, 'A,B' FROM DUAL
UNION ALL SELECT 2, 'a,b,c,d' FROM DUAL
)
SELECT A.KEY, A.COLS, REGEXP_SUBSTR(A.COLS,'[^,]+',1,LEVEL) AS COL
FROM W_DATA A
CONNECT BY
LEVEL <= LENGTH(A.COLS)-LENGTH(REPLACE(A.COLS,','))+1
AND PRIOR A.KEY = A.KEY AND PRIOR DBMS_RANDOM.VALUE >= 0
;