by 토로 [SQL Query] WHERE CASE INSERT INTO [2020.12.24 13:46:26]
안녕하세요. 복습하려고 쿼리 문제를 만들어 보고 있습니다. 근속년수에 맞춰 VACATION 값을 각각 넣어주고 싶은데
생각대로 잘 안 됩니다. INSERT INTO도 오류가 뜨고 CASE로도 오류가 나서 이러지도 저러지도 못하고 있네요..
힌트라도 얻고 싶어 질문 올립니다. 어떻게 접근하면 문제를 완성시킬 수 있을까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 | --1 --근속년수가 10년 미만, 10년 이상 20년 이하, 20년 이상 30년 이하로 그룹을 나누어 유급 휴가를 주려 한다. --3일, 5일, 7일의 유급 휴가일(VACATION)을 테이블에 추가하여 사원명, 근속년수, 유급 휴가일을 조회하라. ALTER TABLE EMPLOYEE ADD VACATION VARCHAR (15); SELECT EXTRACT( YEAR FROM SYSDATE )- EXTRACT( YEAR FROM HIRE_DATE) 근속년수, VACATION "유급 휴가일" FROM EMPLOYEE <span style= "background-color:#ffff00" > WHERE CASE WHEN 근속년수 < 10 THEN VACATION '3일' CASE WHEN 근속년수 BETWEEN 10 AND 20 THEN VACATION '5일' </span> END |
1. 지난번 질문에서 Select 절의 알리아스인 "근속년수" 를 Where 절에서 사용할 수 없다고 답변 했었는데요.
2. CASE 문의 사용법이 문법에 어긋나네요. THEN 절의 내용이 이상하네요.
3. CASE 문을 WHERE 절에서 사용할게 아니라 Select 절에서 사용해야죠.
4. vacation 은 문자 "3일" 형식 보다는 숫자로 하는게 좋을 듯 합니다.
5. vacation 컬럼의 값을 변경하는 것라면 Insert 가 아니라 Update 를 사용해야죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -- 1. 확인용 -- SELECT emp_id , emp_name , hire_date , TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(hire_date, 'yyyy' ) 근속년수 , CASE WHEN TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(hire_date, 'yyyy' ) < 10 THEN 3 WHEN TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(hire_date, 'yyyy' ) < 20 THEN 5 ELSE 7 END vacation FROM employee ; -- 2. 갱신용 -- UPDATE employee SET vacation = CASE WHEN TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(hire_date, 'yyyy' ) < 10 THEN 3 WHEN TO_CHAR(sysdate, 'yyyy' ) - TO_CHAR(hire_date, 'yyyy' ) < 20 THEN 5 ELSE 7 END ; |
1 2 3 4 5 6 7 8 9 10 | -- 일자까지 고려한 근속년수 -- SELECT emp_id , emp_name , hire_date , TRUNC(MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12) 근속년수 , CASE WHEN MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12 < 10 THEN 3 WHEN MONTHS_BETWEEN(TRUNC(sysdate) + 1, hire_date) / 12 < 20 THEN 5 ELSE 7 END vacation FROM employee ; |