MySQL에서 데이터를 조회할 때 NULL 값, 빈 문자열(''), 공백만 있는 값을 모두 제외하고 실제로 의미 있는 데이터만 선택해야 하는 경우가 자주 발생합니다. 이 글에서는 IS NOT NULL 조건과 TRIM() 함수를 조합하여 이러한 문제를 해결하는 방법을 단계별로 알아보겠습니다.
기본 문법
비어 있지 않은 열 값을 선택하려면 아래와 같은 쿼리 구문을 사용합니다.
SELECT * FROM yourTableName WHERE yourColumnName IS NOT NULL AND TRIM(yourColumnName) <> '';
이 쿼리의 핵심은 두 가지 조건입니다. 첫째, IS NOT NULL은 NULL 값을 걸러내고, 둘째, TRIM(열이름) <> ''는 앞뒤 공백을 제거한 후 빈 문자열인지 확인합니다. 이렇게 하면 공백으로만 이루어진 값도 함께 필터링할 수 있습니다.
예제 테이블 생성하기
실습을 위해 먼저 테스트용 테이블을 만들어 보겠습니다. 다음 쿼리로 SelectNonEmptyValues 테이블을 생성합니다.
mysql> create table SelectNonEmptyValues
-> (
-> Id int not null auto_increment,
-> Name varchar(30),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.62 sec)테스트 데이터 삽입하기
다양한 케이스를 테스트하기 위해 정상적인 이름, NULL, 빈 문자열, 공백 등 여러 형태의 데이터를 삽입합니다.
mysql> insert into SelectNonEmptyValues(Name) values('John Smith');
Query OK, 1 row affected (0.20 sec)
mysql> insert into SelectNonEmptyValues(Name) values(NULL);
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonEmptyValues(Name) values('');
Query OK, 1 row affected (0.24 sec)
mysql> insert into SelectNonEmptyValues(Name) values('Carol Taylor');
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonEmptyValues(Name) values('DavidMiller');
Query OK, 1 row affected (0.28 sec)
mysql> insert into SelectNonEmptyValues(Name) values(' ');
Query OK, 1 row affected (0.18 sec)전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from SelectNonEmptyValues;
실행 결과는 다음과 같습니다.
+----+-----------------------+ | Id | Name | +----+-----------------------+ | 1 | John Smith | | 2 | NULL | | 3 | | | 4 | Carol Taylor | | 5 | DavidMiller | | 6 | | +----+-----------------------+ 6 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이, 테이블에는 NULL(Id 2), 빈 문자열(Id 3), 공백만 있는 값(Id 6)이 섞여 있습니다.
비어 있지 않은 값만 선택하는 쿼리
이제 핵심 쿼리를 실행해 보겠습니다. 아래 쿼리는 NULL, 빈 문자열, 공백 등 모든 경우를 처리하여 유효한 값만 반환합니다.
mysql> SELECT * FROM SelectNonEmptyValues WHERE Name IS NOT NULL AND TRIM(Name) <> '';
실행 결과는 다음과 같습니다.
+----+--------------+ | Id | Name | +----+--------------+ | 1 | John Smith | | 4 | Carol Taylor | | 5 | DavidMiller | +----+--------------+ 3 rows in set (0.00 sec)
정리 및 추가 팁
결과를 보면 NULL, 빈 문자열, 공백 값이 모두 제외되고 실제 이름이 있는 세 개의 행만 조회된 것을 확인할 수 있습니다.
몇 가지 추가로 알아두면 좋은 사항은 다음과 같습니다.
1. TRIM() 함수의 역할: TRIM()은 문자열 양쪽 끝의 공백을 제거합니다. 따라서 ' '처럼 공백 하나만 있는 값도 ''(빈 문자열)가 되어 조건에 걸러집니다.
2. 성능 최적화: WHERE 절에서 함수를 사용하면 인덱스를 활용하지 못할 수 있으므로, 대량의 데이터를 다룰 때는 주의가 필요합니다. 가능하다면 데이터 입력 단계에서 유효성 검사를 통해 빈 값을 미리 방지하는 것이 좋습니다.
3. 다른 DBMS에서의 호환성: Oracle에서는 빈 문자열이 자동으로 NULL로 처리되지만, MySQL에서는 빈 문자열과 NULL이 서로 다른 값으로 구분됩니다. 따라서 MySQL에서는 위와 같이 두 조건을 함께 사용하는 것이 안전합니다.