2013-11-04 53 views
13

讓說我有一個這樣的表名爲test:如何將NULL視爲MAX日期而不是在MySQL中忽略它?

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?

+0

任何符合要求的SQL實現都應該這樣做。 – EJP

回答

15

給這一個鏡頭:

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

http://sqlfiddle.com/#!2/76290/3 –

+0

它的工作表示感謝。你可以請解釋我MAX(DATE IS NULL)= 0 – user2741700

+0

基本上說,如果沒有NULL,然後使用最大(DATE) –

7

NULL不是一個值或數它只是空。這就是爲什麼你使用「col1爲空」而不是「col1 = null」的原因。解決方法是使用IFNULL並設置一個非常高的值。

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

你是間接引入最大日期而不使用NULL – ezdazuzena

2

你可以使用IF語句:

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

FYI NULLaggregation功能使用時被忽略。

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)