MySQL에서 NULL 값이 있는 열을 안전하게 연결하기
MySQL에서 CONCAT() 함수로 두 개의 열을 연결할 때, 하나의 열 값이라도 NULL이면 결과 전체가 NULL로 반환되는 문제가 발생합니다. 쿼리 실행 시 이러한 문제를 피하려면 IFNULL() 함수를 함께 사용하는 것이 좋습니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1793
(
StudentFirstName varchar(20),
StudentLastName varchar(20)
);
Query OK, 0 rows affected (0.00 sec)
insert 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1793 values('John','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1793 values('Carol',NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1793 values(NULL,'Brown');
Query OK, 1 row affected (0.00 sec)select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1793;
실행 결과는 다음과 같습니다.
+------------------+-----------------+
| StudentFirstName | StudentLastName |
+------------------+-----------------+
| John | Smith |
| Carol | NULL |
| NULL | Brown |
+------------------+-----------------+
3 rows in set (0.00 sec)
위 데이터에서 볼 수 있듯이 'Carol'의 성(LastName)과 'Brown'의 이름(FirstName)은 NULL입니다. 만약 단순히 CONCAT(StudentFirstName, StudentLastName)을 실행하면 해당 행의 결과 역시 모두 NULL로 출력됩니다.
NULL을 처리하며 두 열을 연결하는 쿼리
다음은 열 값 중 하나가 NULL인 경우에도 정상적으로 두 열을 연결하는 쿼리입니다.
mysql> select concat(ifnull(StudentFirstName,''),ifnull(StudentLastName,'')) from DemoTable1793;
실행 결과는 다음과 같습니다.
+----------------------------------------------------------------+
| concat(ifnull(StudentFirstName,''),ifnull(StudentLastName,'')) |
+----------------------------------------------------------------+
| JohnSmith |
| Carol |
| Brown |
+----------------------------------------------------------------+
3 rows in set (0.00 sec)
IFNULL() 함수는 첫 번째 인수가 NULL이면 두 번째 인수로 지정한 값(여기서는 빈 문자열 '')을 대신 반환합니다. 따라서 NULL 값이 빈 문자열로 치환되어 CONCAT() 함수가 정상적으로 작동하며, 'JohnSmith', 'Carol', 'Brown'처럼 의도한 결과를 얻을 수 있습니다.
참고: COALESCE() 함수 활용
IFNULL() 외에도 COALESCE() 함수를 사용하면 동일한 결과를 얻을 수 있습니다. COALESCE()는 인수 목록에서 NULL이 아닌 첫 번째 값을 반환하며, 여러 개의 후보 값을 처리해야 할 때 특히 유용합니다.
mysql> select concat(coalesce(StudentFirstName,''),coalesce(StudentLastName,'')) from DemoTable1793;
두 함수 모두 NULL 값을 기본값으로 대체하는 역할을 하므로, 상황에 맞게 선택하여 사용하면 됩니다.