regexp_substr 를 이용한 데이터 분리 1 6 2,266

by 송민구 [SQL Query] [2015.12.22 16:49:15]


안녕하세요

아래 쿼리를 돌려보면 당연히 콤마로 잘라서 행으로 보여줍니다.

그런데 기준 데이터가 여러행일경우 하나씩 더 나오게 되는데요..

그래서 전체를 다시 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;

by 창조의날개 [2015.12.22 17:01:15]

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의 숫자를 원하시는 크기로 늘리시면 됩니다.

 


by 송민구 [2015.12.22 17:55:06]

와우 감사합니다. connect를 사용하지 않고 data 개수에 대해서 바로 from에 추가하는 것이군요

Max 에 대해서 알수 있다면 아주 유용할것 같습ㄴ다.

감사합니다.~
 


by 아발란체 [2015.12.22 17:01:19]

그룹바이 하지 않고 보이는 결과셋에서 원하는 4개 결과가 있다면,

그 4개 결과만 특정 값이 출력 되도록 하게 하고, 조건절에서 구분이 없는 것은 필터링하면 될 것 같습니다.


by atumlee [2015.12.23 10:39:44]
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
;

by 송민구 [2015.12.23 13:32:10]

와.감사합니다.

max를 구할 필요가 없는 쿼리네요

제가 원하던 답이네요

정말 감사합니다


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