Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 필드가 빈 문자열('')인지 NULL인지 확인하는 방법

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 문 방식이 가장 명확합니다.