MySQL에서 NULL과 빈 문자열('')은 서로 다른 개념입니다. 두 값은 겉보기에 비슷해 보이지만 실제로는 완전히 별개의 상태이며, 이를 구분하지 못하면 데이터 조회나 조건 처리에서 예상치 못한 오류가 발생할 수 있습니다.
필드가 빈 문자열인지, 아니면 NULL인지 확인하려면 IS NULL 속성과 함께 CASE 문을 활용하는 것이 가장 효과적입니다. CASE 문을 사용하면 여러 조건을 한 번의 쿼리로 모두 처리할 수 있습니다.
CASE 문 기본 문법
필드가 빈 문자열인지 또는 NULL인지 판별하는 기본적인 문법은 다음과 같습니다.
SELECT *, CASE WHEN yourColumnName = '' THEN 'yourMessage1' WHEN yourColumnName IS NULL THEN 'yourMessage2' ELSE CONCAT(yourColumnName, ' is a Name') END AS anyVariableName FROM yourTableName;
예제 테이블 생성하기
위 문법을 실제로 이해하기 위해 간단한 테이블을 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table checkFieldDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.64 sec)테스트 데이터 삽입하기
INSERT 명령어를 사용해 NULL 값과 빈 문자열이 섞여 있는 레코드들을 입력합니다.
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.17 sec)
mysql> insert into checkFieldDemo(Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.10 sec)
mysql> insert into checkFieldDemo(Name) values('');
Query OK, 1 row affected (0.51 sec)
mysql> insert into checkFieldDemo(Name) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into checkFieldDemo(Name) values('');
Query OK, 1 row affected (0.17 sec)
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.10 sec)저장된 전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from checkFieldDemo;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | NULL | | 2 | John | | 3 | NULL | | 4 | | | 5 | Carol | | 6 | | | 7 | NULL | +----+-------+ 7 rows in set (0.00 sec)
CASE 문으로 빈 문자열과 NULL 구분하기
이제 CASE 문을 사용해 각 필드가 빈 문자열인지, NULL인지, 아니면 실제 이름 값인지를 구분해 출력하는 쿼리를 실행합니다.
mysql> select *,case -> when Name='' then 'It is an empty string' -> when Name is null then 'It is a NULL value' -> else concat(Name,' is a Name') -> END as ListOfValues -> from checkFieldDemo;
실행 결과는 다음과 같습니다.
+----+-------+-----------------------+ | Id | Name | ListOfValues | +----+-------+-----------------------+ | 1 | NULL | It is a NULL value | | 2 | John | John is a Name | | 3 | NULL | It is a NULL value | | 4 | | It is an empty string | | 5 | Carol | Carol is a Name | | 6 | | It is an empty string | | 7 | NULL | It is a NULL value | +----+-------+-----------------------+ 7 rows in set (0.00 sec)
결과에서 확인할 수 있듯이, Id가 1, 3, 7인 행은 NULL 값으로 판별되었고, Id가 4, 6인 행은 빈 문자열로 정확히 구분되었습니다.
참고: IFNULL 함수 활용하기
단순히 NULL 값을 다른 값으로 대체하고 싶다면 IFNULL() 또는 COALESCE() 함수를 사용할 수도 있습니다. 예를 들어 IFNULL(Name, 'N/A')처럼 작성하면 NULL인 경우에만 지정한 문자열로 대체되며, 빈 문자열은 그대로 유지됩니다. 반면 빈 문자열까지 함께 처리하려면 위에서 소개한 CASE 문 방식이 가장 명확합니다.