밑에 콤마로 구분된 데이터에서 값 찾기 오라클로 해보고 있는데요.. 0 2 845

by 동동동 [SQL Query] [2021.04.06 18:23:17]


WITH "예능" ("프로그램명", MC,"방송사") AS (
SELECT '유 퀴즈 온 더 블럭', '유재석,조세호', 'tvN' FROM DUAL UNION ALL
SELECT '강호동의밥심', '강호동,남창희', 'SBSPlus' FROM DUAL UNION ALL
SELECT '아는형님', '강호동,서장훈,이수근,김희철,..', 'JTBC' FROM DUAL UNION ALL
SELECT '런닝맨', '유재석,김종국,전소민,이광수,..', 'SBS' FROM DUAL UNION ALL
SELECT '무엇이든 물어보살', '서장훈,이수근', 'KBS joy' FROM DUAL UNION ALL
SELECT '나혼자산다', '박나래,기안84,성훈,..', 'MBC' FROM DUAL UNION ALL
SELECT '슈가맨', '유재석,유희열', 'JTBC' FROM DUAL
)
SELECT 프로그램명
     , REGEXP_SUBSTR(MC,'[^,]+', 1, LEVEL)
     , 방송사 
  FROM 예능
CONNECT BY REGEXP_SUBSTR(MC, '[^,]+', 1, LEVEL) IS NOT NULL
;

 

MC가 "강,박,이" 성씨가 아닌 값들을 가져오려고 해보고 있는데요..

구분자를 Row로 생성 후 Not Like 해보려고 하는데...Row가 엄청 생성되네요....

 

http://gurubee.net/article/79502 에서 보면 Level을 발생될 수 있는 경우의 수 만큼 생성 하는 방법이 있던데요..

 

WITH "예능" ("프로그램명", MC,"방송사") AS (
SELECT '유 퀴즈 온 더 블럭', '유재석,조세호', 'tvN' FROM DUAL UNION ALL
SELECT '강호동의밥심', '강호동,남창희', 'SBSPlus' FROM DUAL UNION ALL
SELECT '아는형님', '강호동,서장훈,이수근,김희철,..', 'JTBC' FROM DUAL UNION ALL
SELECT '런닝맨', '유재석,김종국,전소민,이광수,..', 'SBS' FROM DUAL UNION ALL
SELECT '무엇이든 물어보살', '서장훈,이수근', 'KBS joy' FROM DUAL UNION ALL
SELECT '나혼자산다', '박나래,기안84,성훈,..', 'MBC' FROM DUAL UNION ALL
SELECT '슈가맨', '유재석,유희열', 'JTBC' FROM DUAL
)
SELECT 프로그램명
     , REGEXP_SUBSTR(MC,'[^,]+', 1, LV) MC
     , 방송사 
  FROM 예능
  , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= ( SELECT MAX(REGEXP_COUNT(MC,',')) FROM 예능)) LE
WHERE LE.LV <= REGEXP_COUNT(MC,',') + 1
ORDER BY 프로그램명, 방송사, MC
;

 

Level을 발생될 수 있는 경우의 수 만큼 생성 안하고 할 수 있는 방법이 있을까요?

 

by 마농 [2021.04.06 19:12:01]

1. Connect By Level <= n 를 통한 행복제 방식은
- 반드시 dual 과 같은 1건 집합에만 적용하는 방식입니다.
- 여러건의 집합에 직접 적용시 엄청난 수의 복제가 발생되게 됩니다.
- http://gurubee.net/article/55635
2. 기존 질문에서도 MSSQL 방식으로 답변 드렸었지만.
- 굳이 행복제가 필요 없는 문제입니다.
- 문제 : MC의 성이 강,박,이 는 제외한 모든 프로그램 정보 출력
- MSSQL  : WHERE ',' + MC NOT LIKE '%,[강박이]%'
- Oracle : WHERE NOT REGEXP_LIKE(','||MC, ',[강박이]')
- http://gurubee.net/article/84238

SELECT 프로그램명, MC, 방송사
  FROM (SELECT 프로그램명, MC, 방송사
             , SUBSTR(REGEXP_SUBSTR(MC, '[^,]+', 1, lv), 1, 1) 성씨
          FROM 예능
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
         WHERE lv <= REGEXP_COUNT(MC, '[^,]+')
        )
 GROUP BY 프로그램명, MC, 방송사
HAVING COUNT(CASE WHEN 성씨 IN ('강','박','이') THEN 1 END) = 0
;

SELECT *
  FROM 예능
 WHERE NOT REGEXP_LIKE(','||MC, ',[강박이]')
-- WHERE REGEXP_INSTR(','||MC, ',[강박이]') = 0
;

 


by 동동동 [2021.04.07 08:33:57]

마농님 감사합니다..^^

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