Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

คืนค่า NULL สำหรับ DATE_FORMAT เมื่อ Input เป็น NULL ใน MySQL


ปัญหา

DATE_FORMAT(NULL, ...) คืน NULL แล้ว แต่บางครั้งต้องการควบคุมให้ชัดเจน หรือใช้ใน expression ที่ซับซ้อน

วิธีแก้: ใช้ IF() หรือ CASE WHEN

รูปแบบคำสั่ง

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

ตัวอย่างครบถ้วน

1. สร้างตารางมี NULL ปน

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

2. เพิ่มข้อมูล (มี NULL 3 แถว)

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)

3. ดูข้อมูลดิบ

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 |
+----+---------------------+

4. IF() ควบคุม 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                                                  |
+-------------------------------------------------------------+

วิธีอื่น: CASE WHEN (มาตรฐาน ANSI SQL)

SELECT CASE 
    WHEN ShippingDate IS NOT NULL THEN DATE_FORMAT(ShippingDate, '%d/%m/%Y')
    ELSE NULL
END AS formatted_date
FROM returnNullWhenInputIsNullDemo;

COALESCE สำหรับ Default Value

-- ถ้า NULL ให้แสดง 'N/A' แทน
SELECT COALESCE(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), 'N/A') 
FROM returnNullWhenInputIsNullDemo;
+----------------------------------------------------------+
| COALESCE(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), 'N/A')   |
+----------------------------------------------------------+
| 21/01/2019                                               |
| N/A                                                      |
| 25/03/2018                                               |
| N/A                                                      |
| N/A                                                      |
| 23/04/2012                                               |
| 01/12/2018                                               |
| 13/11/2016                                               |
+----------------------------------------------------------+

NULLIF สำหรับค่าพิเศษ

-- ถ้า date เป็น '1970-01-01' (epoch) ให้คืน NULL
SELECT NULLIF(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), '01/01/1970')
FROM table;

Performance: Generated Column (MySQL 5.7+)

ALTER TABLE t 
ADD COLUMN formatted_date VARCHAR(20) 
GENERATED ALWAYS AS (IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL)) STORED;

คำนวณอัตโนมัติตอน INSERT/UPDATE index ได้ query เร็ว

สรุป: IF(date_col, DATE_FORMAT(...), NULL) ควบคุม NULL behavior ได้ชัดเจนใน MySQL