[SQL] 일반함수 CASE

·2025년 7월 3일
0

SQL

목록 보기
51/126

예제 답


문제1. 다음의 문제를 decode 함수로 구현해보세요.

이름, 월급, 보너스를 출력하는데 보너스가 월급이 2500 이상이면 900을 출력하고 그렇지 않으면 0 을 출력하시오

-- 에러 발생
select ename, sal, decode( sal >= 2500, 900, 0 ) as 보너스
 from emp;
 
 ORA-00907: 누락된 우괄호

https://docs.oracle.com/error-help/db/ora-00907/00907. 00000 -  "missing right parenthesis"
*Document: YES
*Cause:    A left parenthesis was entered without a closing
           right parenthesis, or there was unrecognized information in the
           parentheses. All parentheses must be entered in pairs.
*Action:   Correct the syntax and retry the statement.
1, 32열에서 오류 발생

💡 decode --> 등호(=) 비교만 가능
case 문 --> 등호(=) 부등호(>=, <=, >, <) 비교 모두 가능

select ename, sal, case when sal >= 2500 then 900
                   else 0 end as 보너스
 from emp;

문제2. 이름, 월급, 보너스를 출력하는데 보너스가 월급이 3000 이상이면 300을 출력하고 월급이 2000 이상이고 3000 보다 작으면 200을 출력하고 나머지 월급은 그냥 100을 출력하시오

select ename, sal, case when sal >= 3000 then 300
                        when sal >= 2000 then 200
                   else 100 end as 보너스
 from emp;

💡

case 문법:  case when 조건1  then1
                when 조건2  then2
                when 조건3  then3
           else4  end  as  "별칭"

문제3. emp21 테이블에서 이름와 나이와 등급을 출력하는데 등급이 다음과 같이 출력되게하시오

나이가 30살 이상이면 A, 나이가 28살 이상이면 B, 25살이상이면 C, 나머지 나이는 D 로 등급을 출력되게하시오

select ename, age, case when age >= 30 then 'A'
                        when age >= 28 then 'B'
                        when age >= 25 then 'C'
                   else 'D' end as 등급
 from emp21;

문제4. 위의 결과를 다시 출력하는데 등급을 ABCD 순으로 정렬해서 출력하시오

select ename, age, case when age >= 30 then 'A'
                        when age >= 28 then 'B'
                        when age >= 25 then 'C'
                   else 'D' end as 등급
 from emp21
 order by 3;

문제5. 이름, 입사일, 입사한 년도를 4자리로 출력하시오

select ename, hiredate, to_char(hiredate, 'RRRR')
 from emp;

문제6. 위의 결과를 다시 출력하는데 1981년도에 입사한 사원들만 출력하시오

select ename, hiredate, to_char(hiredate, 'RRRR')
 from emp
 where to_char(hiredate, 'RRRR') = '1981';

문제7. 이름, 입사일, 입사한 년도 4자리, 보너스를 출력하는데 보너스가 입사한 년도가 1980년이면 500을 출력하고 1981년이면 400을 출력하고 나머지 년도면 0을 출력하시오

select ename, hiredate, to_char(hiredate, 'RRRR'),
       case when to_char(hiredate, 'RRRR') = '1980' then 500
            when to_char(hiredate, 'RRRR') = '1981' then 400
       else 0 end as 보너스
 from emp;

문제8. emp21 테이블에서 이름, 나이, 통신사, 보너스를 출력하는데 보너스가 통신사가 SK면 600을 출력하고 KT 면 500을 출력하고 나머지 통신사는 400을 출력하시오

select ename, age, telecom, case when lower(telecom) like '%SK%' then 600
                                 when lower(telecom) like '%KT%' then 500
                            else 400 end as 보너스
 from emp21;

emp21 테이블에서 이름과 나이와 보너스를 출력하는데 성씨가 김씨면 보너스를 600을 출력하고 이씨면 500을 출력하고 박씨와 최씨는 400을 출력하고 나머지 성씨는 300을 출력하시오

select ename, age, case when ename like '김%' then 600
                        when ename like '이%' then 500
                        when ename like '박%' or ename like '최%' then 400
                   else 300 end as 보너스
 from emp21;

0개의 댓글