[MySQL] NULL 처리 함수 (ifnull, coalesce, nullif, if, case when ... then... end)

SQL에서 NULL을 다른 값으로 치환하거나, NULL 여부를 판단하는 방식이 많이 쓰인다.
다시 한번 정리하고자 한다.
IFNULL()
값이 NULL일 때 대체 값을 반환한다.
IFNULL(expression, value_if_null)
expression : null 여부를 검사할 값
value_if_null : expression이 null 일 때 대신 반환할 값
=> expression이 null이면 대체값을 반환하고, null이 아니면 그대로 반환한다!
예시
SELECT IFNULL(NULL, 'NONE'); -- 'NONE'
SELECT IFNULL(5, 6); -- 5
SELECT IFNULL(5/0, 'Dividing by 0 returns NULL'); -- 'Dividing by 0 returns NULL'
COALESCE()
여러 값 중 첫 번째 NULL이 아닌 값을 반환
COALESCE(expression1, expression2, ..., expression_n)
왼쪽부터 순서대로 검사하여 첫 번째 NULL이 아닌 값을 반환한다.
만약 모든 인자가 NULL이면 NULL을 반환한다.
예시
SELECT COALESCE(NULL, NULL, 'A', 'B'); -- 'A'
SELECT COALESCE('A', 'B', NULL, 'C'); -- 'A'
SELECT COALESCE(NULL, 1, 2, 3); -- 1
SELECT COALESCE(NULL, 'NONE', 'backup'); -- 'NONE'
SELECT COALESCE(NULL, NULL, NULL); -- NULL
NULLIF
두 값이 같으면 NULL을, 다르면 첫 번째 값을 반환
NULLIF(expression1, expression2)
예시
SELECT NULLIF('A', 'A'); -- NULL
SELECT NULLIF('A', 'B'); -- 'A'
SELECT NULLIF(5, 5); -- NULL
SELECT NULLIF(5, 6); -- 5
IF
조건식이 참인지 거짓인지에 따라 다른 값을 반환
IF(condition, value_if_true, value_if_false)
condition : 조건식
value_if_true : 조건식이 참일 때 반환할 값
value_if_false : 조건식이 거짓일 때 반환할 값
예시
SELECT IF(100 < 200, 'yes', 'no');
-- 결과: 'yes'
SELECT IF(STRCMP('A','B')=0, 'same', 'different');
-- 결과: 'different'
SELECT IF(100 < 200, 5000, 6000);
-- 결과: 5000
CASE WHEN ... THEN ... ELSE ... END
여러 조건을 순서대로 판단하고,
처음으로 TRUE가 되는 조건의 결과(result) 를 반환한다.
조건이 하나도 만족하지 않으면 ELSE절의 값을 반환하고,
ELSE가 없으면 NULL을 반환한다.
CASE [expression]
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n
ELSE result
END
만약 expression이 있다면, 해당 컬럼의 값을 조건에 따라 분기하는 것이고,
expression이 없이 그냥 주어진다면, 여러 컬럼을 조건으로 걸 수 있어 유연하게 사용 가능하다.
예시
SELECT name, score, age,
CASE
WHEN score >= 90 THEN 'High'
WHEN score >= 80 AND age < 20 THEN 'Rising'
WHEN age > 40 THEN 'Senior'
ELSE 'Normal'
END AS level
FROM students;
expression이 없기에, score와 age 등 여러 컬럼을 조건에 따라 분기처리했다.
프로그래머스 예제
12세 이하인 여자 환자 목록 출력하기
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.
SELECT COALESCE(TLNO, 'NONE'), IFNULL(TLNO, 'NONE'), IF(TLNO IS NULL, 'NONE', TLNO),
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;
위와 같이 SQL문을 짜면 어떻게 나올까??

모두 NULL 처리가 잘 됐다!












