MySQL에서 두 열의 최댓값 구하기 – NULL 값 처리하기
MySQL에서 GREATEST() 함수를 사용해 두 열 중 더 큰 값을 구할 때, 한쪽 열에 NULL이 포함되어 있으면 비교 결과 역시 NULL로 반환됩니다. 이 문제를 해결하려면 IF() 함수를 활용해 NULL 값을 0으로 치환한 뒤 비교하면 됩니다.
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.77 sec)
INSERT 명령으로 테이블에 레코드를 삽입합니다. 이때 의도적으로 NULL 값도 함께 넣습니다.
mysql> insert into DemoTable values(78,89);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(19,null);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(null,0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values(null,95);
Query OK, 1 row affected (0.15 sec)
SELECT 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 78 | 89 |
| 19 | NULL |
| NULL | 0 |
| NULL | 95 |
+--------+--------+
4 rows in set (0.00 sec)
이제 두 열에서 '최댓값'을 구하는 쿼리입니다. GREATEST() 함수 안에서 IF()로 각 열의 NULL 여부를 검사하고, NULL이면 0으로 대체합니다.
mysql> select greatest(if(Value1 is null,0,Value1),if(Value2 is null,0,Value2)) from DemoTable;
실행 결과는 다음과 같습니다.
+-------------------------------------------------------------------+
| greatest(if(Value1 is null,0,Value1),if(Value2 is null,0,Value2)) |
+-------------------------------------------------------------------+
| 89 |
| 19 |
| 0 |
| 95 |
+-------------------------------------------------------------------+
4 rows in set (0.00 sec)
위 출력을 보면 각 행마다 Value1과 Value2 중 더 큰 값이 정상적으로 반환된 것을 확인할 수 있습니다. 참고로 COALESCE(Value1, 0) 방식을 사용하면 동일한 결과를 더 간결한 코드로 얻을 수 있으니 상황에 맞게 선택하면 됩니다.