MySQL 저장 프로시저 내에서 선언된 로컬 변수에 값이 할당되지 않으면 기본적으로 NULL이 됩니다. 이때 NULL 값을 그대로 연산에 사용하면 결과 역시 NULL이 되어 버리는 문제가 발생합니다. 이를 해결하려면 COALESCE() 함수를 사용하면 됩니다.
COALESCE() 함수란?
COALESCE() 함수는 인수로 전달된 값들 중 NULL이 아닌 첫 번째 값을 반환하는 함수입니다. 따라서 변수가 NULL일 경우 대체할 기본값(예: 0)을 지정하여 안전하게 연산을 수행할 수 있습니다.
저장 프로시저 작성 예제
아래 예제는 두 개의 로컬 변수를 선언하고, NULL 여부를 확인한 뒤 합계를 구하는 저장 프로시저입니다.
mysql> DELIMITER //
mysql> CREATE PROCEDURE local_VariableDemo()
BEGIN
DECLARE value1 int;
DECLARE value2 int;
select value1,value2;
select
concat('로컬 변수 NULL 확인 후 합계 = ',COALESCE(value1,0)+COALESCE(value2,0));
END
//
Query OK, 0 rows affected (0.19 sec)
mysql> DELIMITER ;
코드 설명
DECLARE value1 int;,DECLARE value2 int;— 두 개의 정수형 로컬 변수를 선언합니다. 초기값을 지정하지 않았으므로 두 변수 모두 NULL 상태입니다.select value1, value2;— 현재 변수의 값을 조회하여 NULL임을 확인합니다.COALESCE(value1, 0)— value1이 NULL이면 0을 반환하고, 값이 있으면 해당 값을 반환합니다.
저장 프로시저 호출
작성한 프로시저는 CALL 명령으로 실행할 수 있습니다.
mysql> call local_VariableDemo();
실행 결과
+--------+--------+
| value1 | value2 |
+--------+--------+
| NULL | NULL |
+--------+--------+
1 row in set (0.00 sec)
+-----------------------------------------------------------------------------------------------------+
| concat('로컬 변수 NULL 확인 후 합계 = ',COALESCE(value1,0)+COALESCE(value2,0)) |
+-----------------------------------------------------------------------------------------------------+
| 로컬 변수 NULL 확인 후 합계 = 0 |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.03 sec)
결과 분석
첫 번째 SELECT 문의 결과에서 볼 수 있듯이, 초기화되지 않은 value1과 value2는 모두 NULL로 표시됩니다. 만약 COALESCE() 없이 단순히 value1 + value2를 계산했다면 결과는 NULL이 되었을 것입니다.
하지만 COALESCE(value1, 0) + COALESCE(value2, 0)처럼 처리하면 NULL이 0으로 대체되어 최종 합계가 0으로 정상적으로 출력됩니다.
마무리
저장 프로시저에서 로컬 변수의 NULL 여부를 확인하고 안전하게 처리하려면 COALESCE() 함수를 활용하는 것이 가장 간단하고 효과적인 방법입니다. 참고로 IFNULL() 함수나 CASE 표현식을 사용해도 동일한 결과를 얻을 수 있습니다.