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

MySQL에서 NULL이 아닌 유효한 열 값만 선택하는 방법: IS NOT NULL과 TRIM() 함수 완벽 가이드

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에서는 위와 같이 두 조건을 함께 사용하는 것이 안전합니다.