본문 바로가기

반응형

문제

PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

구조

PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

예시


처음에 작성한 쿼리

-- 코드를 입력하세요
SELECT
    PT_NAME,
    PT_NO,
    GEND_CD,
    AGE,
    DECODE(TLNO,IS NULL,'NONE',TLNO) TLNO
FROM PATIENT
WHERE 1=1 
    AND GEND_CD	= 'W'
    AND AGE <= 12
ORDER BY AGE DESC, PT_NAME

틀린 이유

처음엔 막연히 값을 치환해서 출력해주는 Decode를 이용해서 풀려고 했습니다만, 생각해보니 IS NULL은 연산자인데 저 자리에 들어갈 수는 없는 것 이었습니다. 정신차려 조아리야!


수정한 쿼리

-- 1
SELECT
    PT_NAME,
    PT_NO,
    GEND_CD,
    AGE,
    (CASE
        WHEN TLNO IS NULL THEN 'NONE'
        ELSE TLNO
    END) TLNO
FROM PATIENT
WHERE 1=1 
    AND GEND_CD	= 'W'
    AND AGE <= 12
ORDER BY AGE DESC, PT_NAME

-- 2
SELECT
    PT_NAME,
    PT_NO,
    GEND_CD,
    AGE,
    COALESCE(TLNO, 'NONE') TLNO
FROM PATIENT
WHERE 1=1 
    AND GEND_CD = 'W'
    AND AGE <= 12
ORDER BY AGE DESC, PT_NAME

1번은 Case를 이용해서 출력하는 법, 2번은 Coalesce를 이용해서 출력하는 법입니다. 이 둘은 사용법이 다르지만 이와 같은 조건에서는 같은 결과물을 만들 수 있습니다.

Case
└ Case와 End 사이에 When절을 사용하여 특정 조건일 때 Then다음에 실행,출력할 것을 적어줍니다. 그 외의 조건은 Else를 이용해서 출력해줍니다.
Coalesce
└ 여러 개의 인자를 가질 수 있으며 적은 순서대로 NULL값을 체크하여 NULL인 경우 다음 인자로 넘어가서 다시 그 인자의 값이 NULL인지 체크합니다.

 

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/132201

반응형
댓글