Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL CASE 문이 NULL을 반환하는 경우는 언제인가?

MySQL의 CASE 문은 WHEN 절의 어떤 비교 조건도 참이 아닐 경우, ELSE 절 뒤에 지정된 결과값을 반환하도록 설계되어 있습니다. 그렇다면 만약 ELSE 문 자체가 존재하지 않는다면 어떻게 될까요? 이런 상황에서 CASE 문은 아무 값도 반환하지 못하고 NULL을 반환하게 됩니다. 아래 예제를 통해 이 동작 방식을 자세히 살펴보겠습니다.

예제 1: ELSE 절 없이 단순 값 비교하기

mysql> Select CASE 100
    -> WHEN 150 THEN 'It is matched'
    -> WHEN 200 THEN 'It is not matched'
    -> END As 'It Returns NULL';
+-----------------+
| It Returns NULL |
+-----------------+
| NULL            |
+-----------------+
1 row in set (0.00 sec)

위 쿼리에서 평가 대상 값인 100은 WHEN 150과 WHEN 200 두 조건 중 어느 것과도 일치하지 않습니다. 그리고 이 쿼리에는 ELSE 절이 정의되어 있지 않기 때문에, MySQL은 대체할 기본값이 없다는 판단 하에 최종 결과로 NULL을 반환합니다.

예제 2: 실제 테이블 데이터에서 NULL 반환 확인하기

다음 쿼리는 'Students' 테이블의 데이터를 활용하여 국가별 학생 수를 집계하는 예입니다. 여기서 눈여겨볼 부분은 각 국가별 CASE 문의 구성 차이입니다. USA, UK 등 대부분의 열에는 ELSE 0이 포함되어 있어 일치하는 행이 없더라도 0을 반환하지만, WI 열의 CASE 문에는 ELSE 절이 빠져 있습니다.

mysql> Select SUM(CASE WHEN country = 'USA' THEN 1 ELSE 0 END) AS USA,
    -> SUM(CASE WHEN country = 'UK' THEN 1 ELSE 0 END) AS UK,
    -> SUM(CASE WHEN country = 'INDIA' THEN 1 ELSE 0 END) AS INDIA,
    -> SUM(CASE WHEN country = 'Russia' THEN 1 ELSE 0 END) AS Russia,
    -> SUM(CASE WHEN country = 'France' THEN 1 ELSE 0 END) AS France,
    -> SUM(CASE WHEN country = 'NZ' THEN 1 ELSE 0 END) AS NZ,
    -> SUM(CASE WHEN country = 'Australia' THEN 1 ELSE 0 END) AS Australia,
    -> SUM(CASE WHEN country = 'WI' THEN 1 END) AS WI
    -> From Students;
+------+------+-------+--------+--------+------+-----------+------+
| USA  | UK   | INDIA | Russia | France | NZ   | Australia | WI   |
+------+------+-------+--------+--------+------+-----------+------+
| 2    | 1    | 2     | 1      | 1      | 1    | 1         | NULL |
+------+------+-------+--------+--------+------+-----------+------+
1 row in set (0.00 sec)

실행 결과를 보면 WI 열만 NULL로 출력되었습니다. 그 이유는 Students 테이블에 국가가 'WI'인 학생이 한 명도 존재하지 않기 때문입니다. WI 열의 CASE 문에는 ELSE 저이 없으므로 조건에 맞는 행이 하나도 없을 때 NULL이 반환되고, SUM 함수 역시 NULL 값을 그대로 전달받아 최종적으로 NULL을 출력하게 됩니다.

정리

MySQL CASE 문이 NULL을 반환하는 조건은 명확합니다. 즉, 모든 WHEN 조건이 거짓이면서 ELSE 절이 정의되어 있지 않은 경우입니다. 따라서 집계 쿼리나 조건 분기 로직을 작성할 때는 일치하는 값이 없는 상황까지 고려하여 ELSE 절을 명시적으로 작성해 두는 것이 안전한 SQL 작성 습관이라 할 수 있습니다.