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

MySQL에서 입력값이 NULL일 때 DATE_FORMAT이 NULL을 반환하도록 처리하는 방법

MySQL에서 날짜 데이터를 다룰 때 입력값이 NULL인 경우에도 결과를 안전하게 처리해야 하는 상황이 자주 발생합니다. 이럴 때 IF() 함수를 활용하면 날짜 값이 NULL일 때 DATE_FORMAT()이 NULL을 반환하도록 손쉽게 구현할 수 있습니다.

기본 문법

SELECT IF(yourDateColumnName, DATE_FORMAT(yourDateColumnName, '%d/%m/%Y'), NULL)
FROM yourTableName;

IF() 함수는 조건문처럼 작동합니다. 첫 번째 인자가 참(0이 아니고 NULL이 아닌 값)이면 두 번째 인자를 반환하고, 거짓이면 세 번째 인자를 반환합니다. 즉, 날짜 컬럼에 유효한 값이 들어 있으면 포맷팅된 날짜 문자열을 반환하고, NULL이면 NULL을 그대로 돌려줍니다.

예제 테이블 생성

문법을 이해하기 위해 먼저 예제용 테이블을 만들어 보겠습니다.

mysql> CREATE TABLE returnNullWhenInputIsNullDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ShippingDate datetime
    -> );
Query OK, 0 rows affected (1.21 sec)

샘플 데이터 삽입

INSERT 명령으로 배송 날짜 데이터를 여러 건 입력합니다. 비교를 위해 NULL 값도 일부러 포함시켰습니다.

mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2019-01-21');
Query OK, 1 row affected (0.37 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2018-03-25');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2012-04-23');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2018-12-01');
Query OK, 1 row affected (0.23 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2016-11-13');
Query OK, 1 row affected (0.13 sec)

전체 데이터 조회

SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.

mysql> SELECT * FROM returnNullWhenInputIsNullDemo;

실행 결과는 다음과 같습니다.

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 1  | 2019-01-21 00:00:00 |
| 2  | NULL                |
| 3  | 2018-03-25 00:00:00 |
| 4  | NULL                |
| 5  | NULL                |
| 6  | 2012-04-23 00:00:00 |
| 7  | 2018-12-01 00:00:00 |
| 8  | 2016-11-13 00:00:00 |
+----+---------------------+
8 rows in set (0.00 sec)

입력값이 NULL일 때 NULL을 반환하는 쿼리

아래는 DATE_FORMAT() 처리 시 입력값이 NULL이면 NULL을 반환하도록 작성한 쿼리입니다.

mysql> SELECT IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL) FROM returnNullWhenInputIsNullDemo;

실행 결과는 다음과 같습니다.

+-------------------------------------------------------------+
| IF(ShippingDate,date_format(ShippingDate, '%d/%m/%Y'),NULL) |
+-------------------------------------------------------------+
| 21/01/2019                                                  |
| NULL                                                        |
| 25/03/2018                                                  |
| NULL                                                        |
| NULL                                                        |
| 23/04/2012                                                  |
| 01/12/2018                                                  |
| 13/11/2016                                                  |
+-------------------------------------------------------------+
8 rows in set (0.05 sec)

결과를 보면 날짜가 존재하는 행은 %d/%m/%Y(일/월/년) 형식으로 정상적으로 출력되고, NULL이었던 행은 그대로 NULL이 반환된 것을 확인할 수 있습니다.

추가 팁: 더 명확한 NULL 검사

참고로 MySQL의 DATE_FORMAT()은 원래 입력값이 NULL이면 NULL을 반환합니다. 다만 '0000-00-00'처럼 잘못 저장된 영(zero) 날짜가 데이터에 섞여 있을 때는 IF() 방식이 특히 유용합니다. 영 날짜는 숫자로 평가하면 0이 되어 거짓으로 처리되기 때문입니다.

또한 NULL 대신 특정 문자열(예: '-')을 표시하고 싶다면 아래처럼 응용할 수도 있습니다.

SELECT IF(ShippingDate IS NULL OR ShippingDate = 0, '-',
       DATE_FORMAT(ShippingDate, '%d/%m/%Y'))
FROM returnNullWhenInputIsNullDemo;