Подтвердить что ты не робот

Как считать NULL как дату MAX вместо того, чтобы игнорировать его в MySQL?

Предположим, что у меня есть таблица с именем test:

ID   DATE     

1     '2013-01-26'
1     NULL
1     '2013-03-03'      
2     '2013-02-23'      
2     '2013-04-12'      
2     '2013-05-02'   

И я хотел бы получить из этой таблицы:

ID   DATE     

1     NULL    
2     '2013-05-02'   

Вот мой запрос:

select ID, max(DATE)
from test
group by ID

Проблема в том, что MYSQL игнорирует значения NULL и возвращает меня

ID   DATE     

1     '2013-03-03'   
2     '2013-05-02' 

Как я могу это сделать, когда есть NULL, он принимает значение MAX как NULL?

4b9b3361

Ответ 1

Сделайте снимок:

SELECT ID, case when MAX(DATE IS NULL) = 0 THEN max(DATE) END AS DATE
FROM test
GROUP BY ID;

Ответ 2

Null - это не значение или число, которое просто равно null. Вот почему вы используете "where col1 is null", а не "col1 = null". Обходной путь - использовать IFNULL и установить действительно высокое значение.

select ID, max(IFNULL(DATE,'3000-01-01'))
from test
group by ID

Ответ 3

Вы можете использовать оператор IF:

SELECT ID, IF(max(DATE IS NULL) = 0, max(DATE), NULL) AS DATE
FROM test
GROUP BY ID;

Ответ 4

FYI NULL игнорируется при использовании в aggregation.

mysql> SELECT * FROM null_test;
+------+
| c    |
+------+
| NULL |
|    1 |
|    2 |
|    3 |
+------+
4 rows in set (0.00 sec)

mysql> SELECT COUNT(c) FROM null_test;
+----------+
| COUNT(c) |
+----------+
|        3 | <= not 4 but 3
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM null_test;
+----------+
| COUNT(*) |
+----------+
|        4 | <= in this case not 3 but 4
+----------+
1 row in set (0.00 sec)

mysql> SELECT AVG(c) FROM null_test;
+--------+
| AVG(c) |
+--------+
| 2.0000 | <= not (1+2+3) / 4 but (1+2+3) / 3
+--------+
1 row in set (0.00 sec)