MySQL에서 기존 데이터가 NULL 또는 0인 경우에만 특정 값으로 업데이트하고, 그 외의 유효한 값은 그대로 유지해야 하는 경우가 종종 있습니다. 이럴 때는 IF() 함수를 활용하면 간단하게 해결할 수 있습니다.
핵심 아이디어
UPDATE 문에서 IF(조건, 참일 때 값, 거짓일 때 값) 형태로 조건을 걸어, 컬럼 값이 NULL이거나 0일 때만 새 값을 대입하고 나머지 경우에는 원래 값을 유지하도록 처리합니다.
1. 테스트용 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1592
-> (
-> StudentMarks int
-> );
Query OK, 0 rows affected (0.76 sec)2. 샘플 데이터 삽입
NULL과 0이 섞여 있는 다양한 값을 삽입합니다.
mysql> insert into DemoTable1592 values(56); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1592 values(NULL); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1592 values(98); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1592 values(0); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable1592 values(75); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable1592 values(NULL); Query OK, 1 row affected (0.11 sec)
3. 현재 데이터 확인
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1592;
실행 결과는 다음과 같습니다.
+--------------+ | StudentMarks | +--------------+ | 56 | | NULL | | 98 | | 0 | | 75 | | NULL | +--------------+ 6 rows in set (0.00 sec)
4. 조건부 UPDATE 쿼리 실행
이제 값이 NULL이거나 0인 행에만 33으로 업데이트하는 쿼리입니다.
mysql> update DemoTable1592 set StudentMarks=if(StudentMarks IS NULL or StudentMarks=0,33,StudentMarks); Query OK, 3 rows affected (0.17 sec) Rows matched: 6 Changed: 3 Warnings: 0
쿼리 로직을 살펴보면 다음과 같습니다.
StudentMarks IS NULL or StudentMarks=0— 값이 NULL이거나 0인지 검사합니다.- 조건이 참이면 33으로 값을 변경합니다.
- 조건이 거짓이면 자기 자신(
StudentMarks)을 대입하여 기존 값을 그대로 유지합니다.
결과 메시지를 보면 전체 6개 행 중 실제로 변경된 행은 3개(NULL 2개, 0 1개)임을 확인할 수 있습니다.
5. 업데이트 결과 확인
다시 한번 테이블을 조회해 결과를 확인합니다.
mysql> select * from DemoTable1592;
실행 결과는 다음과 같습니다.
+--------------+ | StudentMarks | +--------------+ | 56 | | 33 | | 98 | | 33 | | 75 | | 33 | +--------------+ 6 rows in set (0.00 sec)
정리
NULL은 일반적인 비교 연산자(=)로 비교할 수 없기 때문에 반드시 IS NULL을 사용해야 합니다. 위 예제처럼 IF() 함수 안에서 IS NULL과 =0 조건을 함께 사용하면, 유효한 데이터는 건드리지 않고 빈 값(NULL) 또는 0인 필드만 원하는 값으로 안전하게 업데이트할 수 있습니다.