안녕하세요 쿼리왕초보에요
다름 아니라 CASE WHEN 구문을 이용해서 조건에 맞는 데이터를 가져오려고 하는데요
CASE WHEN 구문은 1개 테이블에서의 조건절에 맞는 데이터를 출력하잖아요
그런데 저는 여러개의 테이블들에서 CASE WHEN을 쓰고 싶은데 쓸 수 있는건가요?
문제) 초등학생테이블(A), 중학생테이블(B), 고등학생테이블(C)가 있다고 가정할 때, 학생번호는 초중고 통합해서 발급받는다고하면 학번이 1~6까지의 조건은 A테이블에서, 학번 7~9는 B테이블에서, 학번 10~12는 C테이블에서 이름을 가져오는 것을 CASE WHEN구문으로 사용 가능 할까요?
예) 테이블정정보 - 학생테이블(학번, 이름)
컬럼정보 - 학번(앞자리가 1~6까진 초등학생, 7~9는 중학생, 10~12까진 고등학생)
질문도 두서없이 써서 읽으시는 분들이 헷갈릴 것 같네요..
답변 부탁드리겠습니다.
통합 학번의 의미를 제가 오해한것 같네요?
- 한 학생이 하나의 학번으로 전학년을 다닌다는 의미로 해석했는데 아닌 듯 하군요?
- 한 학생은 매 학년마다 새로운 학번을 부여 받고, 그걸 하나의 테이블에서 통합 관리한다는 의미인 듯 하네요?
- 학번의 앞 두자리가 학년을 의미한다고 가정하면... ('01' = 1학년)
-- 1. Case 문을 이용하는 방법 -- SELECT m.학번 , CASE WHEN SUBSTR(m.학번, 1, 2) IN ('01','02','03','04','05','06') THEN a.이름 WHEN SUBSTR(m.학번, 1, 2) IN ('07','08','09') THEN b.이름 WHEN SUBSTR(m.학번, 1, 2) IN ('10','11','12') THEN c.이름 END 이름 FROM 학생통합 m , 초등학생 a , 중학생 b , 고등학생 c WHERE a.학번(+) = CASE WHEN SUBSTR(m.학번, 1, 2) IN ('01','02','03','04','05','06') THEN m.학번 END AND b.학번(+) = CASE WHEN SUBSTR(m.학번, 1, 2) IN ('07','08','09') THEN m.학번 END AND c.학번(+) = CASE WHEN SUBSTR(m.학번, 1, 2) IN ('10','11','12') THEN m.학번 END ; -- 2. 굳이 Case 문을 쓰지 않아도 될 듯.(어차피 학번이 겹칠일은 없으므로) SELECT m.학번 , COALESCE(a.이름, b.이름, c.이름) 이름 FROM 학생통합 m , 초등학생 a , 중학생 b , 고등학생 c WHERE m.학번 = a.학번(+) AND m.학번 = b.학번(+) AND m.학번 = c.학번(+) ;
CASE문 다양성만 본다면
WITH 초딩테이블 AS ( SELECT '01231123' AS 학번, '일학년' AS 성명 FROM DUAL UNION ALL SELECT '02231123' AS 학번, '이학년' AS 성명 FROM DUAL UNION ALL SELECT '03231123' AS 학번, '삼학년' AS 성명 FROM DUAL UNION ALL SELECT '04231123' AS 학번, '사학년' AS 성명 FROM DUAL UNION ALL SELECT '05231123' AS 학번, '오학년' AS 성명 FROM DUAL UNION ALL SELECT '06231123' AS 학번, '육학년' AS 성명 FROM DUAL ), 중딩테이블 AS ( SELECT '07311123' AS 학번, '중일학' AS 성명 FROM DUAL UNION ALL SELECT '321123' AS 학번, '중이학' AS 성명 FROM DUAL UNION ALL SELECT '09331123' AS 학번, '중삼학' AS 성명 FROM DUAL ), 고딩테이블 AS ( SELECT '10311123' AS 학번, '고일학' AS 성명 FROM DUAL UNION ALL SELECT '11314123' AS 학번, '고이학' AS 성명 FROM DUAL UNION ALL SELECT '122331123' AS 학번, '고삼학' AS 성명 FROM DUAL ) SELECT 학번, CASE WHEN 학번 < 7 THEN '초딩' WHEN 학번 < 10 THEN '중딩' ELSE '고딩' END FROM ( SELECT TO_NUMBER(SUBSTR(학번, 1, 2)) AS 학번 FROM ( SELECT * FROM 초딩테이블 UNION ALL SELECT * FROM 중딩테이블 UNION ALL SELECT * FROM 고딩테이블 ) );
조건절에 학번을 입력하여 적합한 테이블을 찾을 때
SELECT * FROM 초딩테이블 WHERE 1 = CASE WHEN(TO_NUMBER(SUBSTR(:학번, 1, 2)) < 7) THEN 1 ELSE 0 END AND 학번 = :학번 UNION ALL SELECT * FROM 중딩테이블 WHERE 1 = CASE WHEN(TO_NUMBER(SUBSTR(:학번, 1, 2)) IN(7, 8, 9)) THEN 1 ELSE 0 END AND 학번 = :학번 UNION ALL SELECT * FROM 고딩테이블 WHERE 1 = CASE WHEN(TO_NUMBER(SUBSTR(:학번, 1, 2)) > 9) THEN 1 ELSE 0 END AND 학번 = :학번;