본문 바로가기

Web/Database

[Oracle/SQL] 0이 아니라 0000으로 채우기

반응형

Q. 값이 존재하지 않을 경우 0000으로 채우기

원래 문제: EMP 테이블의 모든 사원을 대상으로 직속 상관의 사원번호(MGR)을 다음과 같은 조건을 기준으로 변환해서 CHG_MGR 열에 출력하세요.

- 직속 상관의 사원 번호가 존재하지 않을 경우: 0000

- 직속 상관의 사원 번호 앞 두 자리가 75일 경우: 5555

- 직속 상관의 사원 번호 앞 두 자리가 76일 경우: 6666

- 직속 상관의 사원 번호 앞 두 자리가 77일 경우: 7777

- 직속 상관의 사원 번호 앞 두 자리가 78일 경우: 8888- 그 외 직속 상관 사원 번호의 경우: 본래 직속 상관의 사원 번호 그대로 출력 

 

A.

처음엔 case 문을 써서 when mgr is null then 0000 이라고 했다.

그러나 0000이 아닌 0만 나왔고, 원인을 생각해보니 해당 데이터가 숫자이기 때문이라고 판단했다.

그래서 해당 부분만 TO_CHAR를 사용해 문자로 바꿔주려했으나, 해당 부분만 바꿀 수는 없고 해당 케이스들이 모두 문자형식이어야 했다. 결국 모두 문자형식으로 바꿔준 다음 '0000'이라는 문자열을 직접 대입해주는 방법으로 해결하였다.

방법이 2가지인 경우는 나는 아예 문자열로 바꿔준 다음 (TO_CHAR 이용) 대입하였는데, SUBSTR 을 사용하면 문자열 데이터로 자동으로 생각해주는 것 같아 SUBSTR을 사용할 수도 있는 것 같다.

 

 

-- 방법 1
SELECT EMPNO, ENAME, MGR,
    CASE 
        WHEN MGR IS NULL THEN '0000'
        WHEN TO_CHAR(MGR) LIKE '75%' THEN '5555'
        WHEN TO_CHAR(MGR) LIKE '76%' THEN '6666'
        WHEN TO_CHAR(MGR) LIKE '%77' THEN '7777'
        WHEN TO_CHAR(MGR) LIKE '%78' THEN '8888'
        ELSE TO_CHAR(MGR)
    END AS CHG_MGR
FROM EMP;

-- 방법 2
SELECT EMPNO, ENAME, MGR,
       CASE
          WHEN MGR IS NULL THEN '0000'
          WHEN SUBSTR(MGR, 1, 2) = '78' THEN '8888'
          WHEN SUBSTR(MGR, 1, 2) = '77' THEN '7777'
          WHEN SUBSTR(MGR, 1, 2) = '76' THEN '6666'
          WHEN SUBSTR(MGR, 1, 2) = '75' THEN '5555'
          ELSE TO_CHAR(MGR)
       END AS CHG_MGR
FROM EMP;

반응형