MySQL返回最大值,如果一列没有值,则返回null

时间:2013-08-02 09:32:32

标签: mysql null max min

我尝试获取mysql select的最大值,但是如果有一行不包含时间戳,则希望将其设置为null / empty / 0。

表统计(简称):

   ID   CLIENT   ORDER_DATE      CANCEL_DATE

    1     5      1213567200
    2     5      1213567200
    3     6      1210629600      1281736799
    4     6      1210629600      1281736799
    5     7      1201042800      1248386399
    6     7      1201042800      
    7     8      1205449200      1271282399

我现在想要获得最低订单日期(没问题,因为它永远不会是空的),并且 最长取消日期。如果客户已经取消了他的订阅,则取消日期已被填写,但如果他仍然有效,则根本没有取消日期。

查询:

SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT

返回:

ID    OD           CD
 5    1213567200                  // fine
 6    1210629600   1281736799     // fine
 7    1201042800   1248386399     // Should be empty
 8    1205449200   1271282399     // fine

如果客户端有一个(或多个)空列,我无法弄清楚如何返回空/ 0 / NULL。还尝试使用NULL字段。

感谢任何提示。

2 个答案:

答案 0 :(得分:5)

我不知道会有多快,但我想这可以解决这个问题:

SELECT ID, min(ORDER_DATE) AS OD,
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD 
FROM stats GROUP BY CLIENT

我无法测试它,但这个解决方案背后的想法是count(cancel_date)应该计算所有非空值条目,如果它等于count(*),这意味着没有空值,它将返回max(cancel_date),否则返回null。

答案 1 :(得分:4)

你可以使用这样的查询:

SELECT
  client,
  min(ORDER_DATE) AS OD,
  case when MAX(CANCEL_DATE IS NULL)=0 THEN max(CANCEL_DATE) END AS CD
FROM
  stats
GROUP BY
  CLIENT

请参阅小提琴here

    当liCEL_DATE不为null时,
  • CANCEL_DATE IS NULL将被评估为0,或者当它为null时,将被评估为1
  • 如果没有带有空值的cancel_date,则
  • MAX(CANCEL_DATE IS NULL)将被计算为0,否则其值将为1.
  • MAX(CANCEL_DATE IS NULL)=0表示没有CANCEL_DATE为空的行时,我们需要在这种情况下返回MAX(cancel_date),否则我们需要返回NULL。