🤔 문제
다음은 종합병원에 등록된 환자정보를 담은 `PATIENT` 테이블입니다.
`PATIENT` 테이블은 다음과 같으며 `PT_NO`, `PT_NAME`, `GEND_CD`, `AGE`, `TLNO`는
각각 환자 번호, 환자 이름, 성별코드, 나이, 전화번호를 의미합니다.
`PATIENT` 테이블에서 12세 이하인 여자환자의 환자 이름, 환자 번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, `NONE`으로 출력시켜주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이가 같다면 환자 이름을 기준으로 오름차순 정렬해주세요.
예시
`PATIENT` 테이블이 다음과 같을 때
SQL을 실행하면 다음과 같이 출력되어야 합니다.
💻 나의 풀이
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12
AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME;
결과
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif)
💡 다른 풀이
1. `IFNULL()` 함수를 활용한 방법
SELECT PT_NAME, PT_NO, GEND_CD, AGE, ifnull(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
2. 조건문 `IF`를 활용한 방법
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(ISNULL(TLNO), 'NONE', TLNO) AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
3. 조건문 `CASE ~ WHEN ~ THEN`을 활용한 방법
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
CASE
WHEN TLNO IS NULL THEN 'NONE'
ELSE TLNO
END AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
✅ 정리
데이터가 없는 경우 원하는 출력 값을 설정하는 방법
1. `IFNULL()` 함수
1) 조회된 데이터가 NULL인 경우
SELECT IFNULL(컬럼명, 대체할 값) AS 별칭
FROM 테이블명
▶ 결과
- 컬럼의 값이 NULL이라면 '대체할 값'을 출력한다.
- 컬럼의 값이 NULL이 아니라면 해당 컬럼의 값을 출력한다.
2) 조회된 데이터가 아예 존재하지 않는 경우(NULL이 아니라 빈칸일 때)
`max()` 집계함수는 그룹내 모든 값들 중 가장 큰 값을 리턴하는데,
데이터가 아예 존재하지 않는 경우 가장 큰 값은 NULL이며, 그 결과 NULL을 '대체할 값'이 출력된다.
SELECT IFNULL(MAX(컬럼명), 대체할 값) AS 별칭
FROM 테이블명
2. 조건문 IF
원래 조건문 `IF`는 `IF(조건, 참일때 값, 거짓일때 값)` 과 같은 구조를 사용한다.
그렇다면, `IF`문을 활용해서 데이터가 없을 경우(NULL일 경우) 대체값을 출력할 수 있도록 어떻게 설정할 수 있을까?
SELECT IF(ISNULL(컬럼명), NULL일 경우 대체값, 컬럼명) AS 별칭
FROM 테이블명
3. 조건문 `CASE ~ WHEN ~ THEN'
- 기본 구조
CASE
WHEN 조건식1 THEN 출력값1
WHEN 조건식2 THEN 출력값2
...
ELSE 위의 모든 조건에 만족하지 않을 경우의 출력값
END
- 활용 예시
SELECT
CASE
WHEN 컬럼명 IS NULL THEN '대체할 값'
ELSE 컬럼명
END AS 별칭
FROM 테이블명
4. `COALESCE` 함수
`COALESCE()` 함수는 주어진 인수에서 NULL이 아닌 첫번째 값을 반환한다.
`IFNULL()` 함수와 역할은 비슷하지만 차이가 있다면,
- `IFNULL(val, '대체할 값')`는 인수가 2개 밖에 없으므로 하나가 NULL이면 대체값을 출력한다. (순서 무관)
- `COALESCE(val1, val2, val3, ...)`는 여러개의 인수가 가능하며, 처음으로 NULL이 아닌 값을 출력한다.
- 기본구조
SELECT COALESCE(컬럼명1, 컬럼명2, 컬럼명3, ...) AS 별칭
FROM 테이블명
- 활용 예시
SELECT COALESCE(컬럼명, 대체할 값) AS 별칭
FROM 테이블명
🔗 References
[IFNULL 함수 활용 방법 참고]
https://eggwhite0.tistory.com/113
SQL 조회된 데이터가 없는 경우, NULL일 때 0으로 출력하기
SQL문에서 조회된 데이터가 NULL인 경우, 없는 경우에 원하는 출력 값을 설정하기 위한 방법을 정리 이름이 table1인 테이블 id data 1 100 2 200 3 300 4 400 5 NULL 1. 먼저 조회된 데이터가 있는 경우 모든 열
eggwhite0.tistory.com
[CASE 조건문 활용 방법 참고]
https://velog.io/@gillog/DB-MySQL-NULL-%EC%B2%98%EB%A6%ACIFNULL-CASE-COALESCE
[DB] MySQL NULL 처리(IFNULL, CASE, COALESCE)
MySQL에서 Column의 값이 Null인 경우를 처리해주는 함수들은 IFNULL, CASE, COALESCE과 같은 함수들이 있다.Orcale의 NVL()과 비슷한 기능을 한다.해당 Column의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있
velog.io
[COALESCE 함수 활용 방법 참고]
https://www.habonyphp.com/2019/02/coalesce.html
MYSQL - COALESCE() 함수
COALESCE() 함수는 주어진 인수에서 첫 번째가 NULL 이 아닌 값을 반환합니다. SELECT COALESCE(value) #ex.1) mysql> SELECT COALESCE( NULL, 1, 2 ); -> 1 mysql> SE...
www.habonyphp.com
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 고득점 Kit] SELECT - 조건에 맞는 도서 리스트 출력하기 (0) | 2024.03.28 |
---|---|
[프로그래머스 SQL 고득점 Kit] SELECT - 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.03.28 |
[프로그래머스 SQL 고득점 Kit] SELECT - 평균 일일 대여 요금 구하기 (0) | 2024.03.27 |
[프로그래머스 SQL 고득점 Kit] SELECT - 흉부외과 또는 일반외과 의사 목록 출력하기 (1) | 2024.03.26 |
[프로그래머스 SQL 고득점 Kit] SELECT - 3월에 태어난 여성 회원 목록 출력하기 (1) | 2024.03.26 |