MySQL에서 여러 열 중 NULL 값이 포함된 레코드 찾기
여러 개의 열(column)로 구성된 집합에서 하나라도 NULL 값이 들어 있는 레코드를 찾아야 할 때가 있습니다. 이럴 때 GREATEST() 함수를 활용하면 아주 간단하게 해결할 수 있습니다.
GREATEST() 함수는 전달된 인수 중 가장 큰 값을 반환하지만, 인수 중 하나라도 NULL이면 결과 역시 NULL을 반환한다는 특징이 있습니다. 바로 이 성질을 이용해 NULL이 포함된 행을 손쉽게 걸러낼 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1862
(
Value1 int,
Value2 int,
Value3 int,
Value4 int
);
Query OK, 0 rows affected (0.00 sec)
2. 샘플 데이터 삽입
insert 명령으로 몇 개의 레코드를 삽입합니다. 일부 레코드에는 의도적으로 NULL 값을 넣었습니다.
mysql> insert into DemoTable1862 values(43,34,56,42);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1862 values(NULL,78,65,NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1862 values(110,NULL,78,NULL);
Query OK, 1 row affected (0.00 sec)
3. 전체 레코드 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1862;
실행 결과는 다음과 같습니다.
+--------+--------+--------+--------+
| Value1 | Value2 | Value3 | Value4 |
+--------+--------+--------+--------+
| 43 | 34 | 56 | 42 |
| NULL | 78 | 65 | NULL |
| 110 | NULL | 78 | NULL |
+--------+--------+--------+--------+
3 rows in set (0.00 sec)
4. NULL 값이 포함된 레코드 조회 쿼리
다음은 열 집합(Value1 ~ Value4) 중 NULL 값이 하나라도 있는 레코드를 찾는 쿼리입니다.
mysql> select * from DemoTable1862 where greatest(Value1,Value2,Value3,Value4) IS NULL;
실행 결과는 다음과 같습니다.
+--------+--------+--------+--------+
| Value1 | Value2 | Value3 | Value4 |
+--------+--------+--------+--------+
| NULL | 78 | 65 | NULL |
| 110 | NULL | 78 | NULL |
+--------+--------+--------+--------+
2 rows in set (0.00 sec)
결과를 보면 Value1 ~ Value4 중 어느 하나라도 NULL인 두 번째, 세 번째 레코드만 정확히 반환된 것을 확인할 수 있습니다.
추가 팁: LEAST() 함수도 같은 원리로 활용 가능
LEAST() 함수 역시 GREATEST()와 마찬가지로 인수 중 하나라도 NULL이면 NULL을 반환하므로, 동일한 방식으로 NULL 검사에 사용할 수 있습니다. 다만 이 방법은 숫자뿐 아니라 문자열, 날짜 등 비교 가능한 타입에도 적용되며, 열 개수가 많은 경우에도 조건문을 반복해서 나열하는 것보다 코드가 훨씬 간결해진다는 장점이 있습니다.