【问题标题】:How consider NULL as the MAX date instead of ignoring it in MySQL?如何将 NULL 视为 MAX 日期而不是在 MySQL 中忽略它?
【发布时间】:2013-11-14 20:10:18
【问题描述】:

假设我有一个名为 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?

【问题讨论】:

  • 任何符合标准的 SQL 实现都应该这样做。

标签: mysql null max


【解决方案1】:

仅供参考 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)

【讨论】:

    【解决方案2】:

    您可以使用 IF 语句:

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

    【讨论】:

      【解决方案3】:

      Null 不是值或数字,它只是 null。这就是为什么你使用“col1 为空”而不是“col1 = null”的原因。解决方法是使用 IFNULL 并设置一个非常高的值。

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

      【讨论】:

      • 您是在间接引入最大日期,而不是使用NULL
      【解决方案4】:

      试一试:

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

      【讨论】:

      • 谢谢。你能解释一下吗 MAX(DATE IS NULL) = 0
      • 基本上说如果没有 NULL 则使用 max(DATE)
      • 你可以更冗长,把THEN max(DATE) ELSE NULL
      • IFNULL() 语法更简洁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多