본문 바로가기

데이터베이스/ORACLE

11. 표현식 ( CASE WHEN THEN ) / 조건식 ( IN, EXISTS )

1. 표현식

  • 하나이상의 값과 연산자, 함수들이 결합된 식

1) CASE WHEN THEN

  • 특정 조건에 따라 값을 변경할 수 있는 수식(표현식)
  • 주로 SELECT절에서 사용

( 사용 형식 )

  CASE WHEN 조건1 THEN1
       WHEN 조건2 THEN2
              : 
       ELSE 값n
  END

 

예제) 사원테이블에서 80번 부서 사원들의 급여를 조회하여 급여가
        15000 이상이면 'A등급',
        5000-14999 사이이면 'B 등급',
        5000 미만이면 'C 등급'으로 비고에 표시하시오
        ( Alias는 사원번호, 사원명, 급여, 비고 )

  SELECT EMPLOYEE_ID AS 사원번호,
         EMP_NAME AS 사원명,
         SALARY AS 급여,
         CASE WHEN SALARY >= 15000 THEN 'A등급'
              WHEN SALARY >= 5000 AND SALARY < 15000 THEN 'B등급' 
                   -- SALARY BETWEEN 5000 AND 14999 THEN
              ELSE 'C등급'      
         END AS 비고
    FROM EMPLOYEES
   WHERE DEPARTMENT_ID = 80; -- 조건 숫자

 

2. 조건식

  • 하나 이상의 표현식과 관계 연산자(논리 연산자)가 결합된 식
  • 연산자는 논리연산자, 관계 연산자, 기타 연산자(IN, ANY, SOME, ALL, EXISTS, LIKE, BETWEEN)
    LIKE 패턴비교연산자 될 수 있으면 안 씀

1) IN 연산자

  • 주어진 값 중 비교항목이 포함되면 TRUE를 반환하는 연산자
  • SOME, ANY와 같은 기능
  • OR 연산자로 대치 가능 OR 연산자보다 단순 간단
  • WHERE 절에 사용

( 사용 형식 )

컬럼명 IN(값1, 값2,...)

 

예제) 상품 테이블에서 분류코드가 'P101', 'P201', 'P301' 중 어느 한 분류에 속한 상품정보를 출력하시오
        ( Alias는 상품코드, 상품명, 분류코드, 판매 가격 )

    (OR 연산자 사용)
    SELECT PROD_ID AS 상품코드,
           PROD_NAME AS 상품명,
           PROD_LGU AS 분류코드,
           PROD_PRICE AS 판매가격
      FROM PROD
     WHERE PROD_LGU = 'P101'
        OR PROD_LGU = 'P201'
        OR PROD_LGU = 'P301'
  ORDER BY PROD_LGU ASC; -- 컬럼명 사용
  -- ORDER BY 3 ASC;     -- 컬럼인덱스 사용 SELECT문에 기술되어진순서 ASC 안써줘도댐 
  -- ORDER BY PROD_LGU ASC, PROD_PRICE DESC ; 분류코드가 똑같은 것은 그안에서 가격이 내림차순으로 정렬한다.
    
   (IN 연산자 사용)
    SELECT PROD_ID AS 상품코드,
           PROD_NAME AS 상품명,
           PROD_LGU AS 분류코드,
           PROD_PRICE AS 판매가격
      FROM PROD
     WHERE PROD_LGU IN('P101', 'P201','P301') 
-- WHERE PROD_LGU NOT IN('P101', 'P201','P301') 부정은 IN앞에 NOT
  ORDER BY PROD_LGU ASC;    
    
     (ANY 연산자 사용)
    SELECT PROD_ID AS 상품코드,
           PROD_NAME AS 상품명,
           PROD_LGU AS 분류코드,
           PROD_PRICE AS 판매가격
      FROM PROD
     WHERE PROD_LGU =ANY('P101', 'P201','P301')  -- ANY와 SUM은 관계연산자가 붙는다 , IN은 관계연산자가 붙지 않는다.
 --        NOT PROD_LGU =ANY ('P101', 'P201','P301')  부정은 전체부정 범위가아닌 나머지 제품들
  ORDER BY PROD_LGU ASC;        
  
   (SOME 연산자 사용)
    SELECT PROD_ID AS 상품코드,
           PROD_NAME AS 상품명,
           PROD_LGU AS 분류코드,
           PROD_PRICE AS 판매가격
      FROM PROD
     WHERE /*NOT*/ PROD_LGU =SOME ('P101', 'P201','P301') 
  ORDER BY PROD_LGU ASC;

 

예제) 직무이력 테이블{JOB_HISTORY)에 존재하는 사원 정보를 조회하시오
        ( Alias는 사원번호, 사원명, 직무 코드, 급여 )

(JOIN을 이용) --공통컬럼존재 FROM절 테이블두개 --조건은 적어도 테이블-1개 
SELECT DISTINCT A.EMPLOYEE_ID AS 사원번호, --중복된것을 없애기 위해
       A.EMP_NAME AS 사원명,
       A.JOB_ID AS 직무코드,
       A.SALARY AS 급여
  FROM EMPLOYEES A, JOB_HISTORY B      --별칭사용
 WHERE A.EMPLOYEE_ID = B.EMPLOYEE_ID;  --별칭을이용 소속추가

(IN을 이용)
SELECT EMPLOYEE_ID AS 사원번호, 
       EMP_NAME AS 사원명,
       JOB_ID AS 직무코드,
       SALARY AS 급여
  FROM EMPLOYEES   
 WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID 
                         FROM JOB_HISTORY);


(EXISTS을 이용)
SELECT A.EMPLOYEE_ID AS 사원번호, 
       EMP_NAME AS 사원명,
       A.JOB_ID AS 직무코드,
       SALARY AS 급여
  FROM EMPLOYEES A  
 WHERE EXISTS (SELECT 1   --1은 의미없다, 
                 FROM JOB_HISTORY B
                WHERE A.EMPLOYEE_ID=B.EMPLOYEE_ID);

 

2._case_when_then.sql
0.00MB

'데이터베이스 > ORACLE' 카테고리의 다른 글

13. 함수 ( FUNCTION )  (0) 2021.03.16
12. 조건식 ( LIKE , BETWEEN )  (0) 2021.03.16
10. 연산자 ( OPERATION )  (0) 2021.03.16
9. SELECT  (0) 2021.03.15
8. 기타 자료형 ( RAW, BFILE, BLOB )  (0) 2021.03.15