개요
MySQL에서 한 컬럼의 값이 NULL일 때, 같은 행에 있는 다른 컬럼의 값으로 대체하면서 해당 필드만 업데이트해야 하는 경우가 있습니다. 이럴 때 COALESCE() 함수를 사용하면 간단하게 해결할 수 있습니다.
COALESCE()는 인자로 전달된 값들 중 첫 번째로 NULL이 아닌 값을 반환하는 함수입니다. 따라서 COALESCE(Name1, Name2)처럼 작성하면 Name1이 NULL일 경우 Name2의 값이 대신 사용됩니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1805
(
Name1 varchar(20),
Name2 varchar(20)
);
Query OK, 0 rows affected (0.00 sec)
2. 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1805 values('Chris',NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1805 values('David','Mike');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1805 values(NULL,'Mike');
Query OK, 1 row affected (0.00 sec)3. 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1805;
실행 결과는 다음과 같습니다.
+-------+-------+
| Name1 | Name2 |
+-------+-------+
| Chris | NULL |
| David | Mike |
| NULL | Mike |
+-------+-------+
3 rows in set (0.00 sec)
4. 단일 필드 업데이트 쿼리
Name1이 NULL인 경우 Name2의 값으로 채우면서 Name1 필드만 업데이트하는 쿼리는 다음과 같습니다.
mysql> update DemoTable1805
set Name1 = coalesce(Name1,Name2);
Query OK, 1 row affected (0.00 sec)
Rows matched: 3 Changed: 1 Warnings: 0
실행 결과를 보면 3개의 행이 매칭되었지만 실제로 변경된 행은 1개뿐입니다. 이는 Name1이 NULL인 행만 값이 변경되고, 이미 값이 있는 행은 그대로 유지되기 때문입니다.
5. 결과 확인
업데이트 후 테이블의 레코드를 다시 한번 조회해 보겠습니다.
mysql> select * from DemoTable1805;
실행 결과는 다음과 같습니다.
+-------+-------+
| Name1 | Name2 |
+-------+-------+
| Chris | NULL |
| David | Mike |
| Mike | Mike |
+-------+-------+
3 rows in set (0.00 sec)
세 번째 행을 보면 Name1이 NULL에서 'Mike'로 변경된 것을 확인할 수 있습니다. 반면 Name1에 이미 값이 있는 행('Chris', 'David')은 기존 값이 그대로 유지됩니다.
정리
COALESCE() 함수를 UPDATE 문과 함께 사용하면 특정 컬럼이 NULL일 때만 다른 컬럼의 값으로 대체하는 조건부 업데이트를 손쉽게 구현할 수 있습니다. 별도의 WHERE 절 없이 전체 테이블에 안전하게 적용할 수 있다는 점이 큰 장점이며, 데이터 정합성을 유지하면서 빈 값을 채워야 하는 상황에서 매우 유용하게 활용됩니다.