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을 발생될 수 있는 경우의 수 만큼 생성 안하고 할 수 있는 방법이 있을까요?
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 ;