使用min()时返回NULL值

时间:2016-10-04 18:58:57

标签: mysql

我有一个查询按特定月份(最小值)返回图像。查询工作正常,除了min永远不会返回NULL值,我需要MIN包含NULL值。我明白MIN不会返回空值,这就是为什么我尝试过COALESCE,IFNULL,ISNULL甚至最少,但没有成功。

这是查询

SELECT i.published_date_year, i.published_date_month
FROM image i
JOIN (
    SELECT i.published_date_year year, MIN(i.published_date_month) month
    FROM image i
    WHERE i.is_listed = 1
    GROUP BY i.published_date_year
) t1 ON t1.year = i.published_date_year AND t1.month = i.published_date_month
WHERE i.published_date_year = 1967 AND i.is_listed = 1
ORDER BY i.published_date_year, i.published_date_month, i.published_date_day, i.image_id DESC

注意

MIN(i.published_date_month)

我希望能够返回空值。看起来MIN不是正确的函数,那么正确的函数或公式是什么?

3 个答案:

答案 0 :(得分:1)

您可以使用ifnull和案例

   SELECT 
      i.published_date_year year
   , case MIN(ifnull(i.published_date_month, 0))
     when 0 then null
     else   MIN(ifnull(i.published_date_month, 0)) 
     end month

答案 1 :(得分:1)

您可以使用NULL单独检查CASE WHEN

SELECT CASE WHEN MAX(i.published_date_month IS NULL) = 0 
          THEN MIN(i.published_date_month)
       END

如果在NULL中找到至少一个NULL,则会返回i.published_date_month

答案 2 :(得分:1)

我确信COALESCE,IFNULL,ISNULL和LEAST的工作得很好。问题是您之后使用结果加入i.published_date_month,显然没有任何东西等于NULL

... ON t1.year = i.published_date_year AND t1.month = i.published_date_month

您可以在表达式中添加围绕OR t1.month IS NULL构建的表达式,或者只选择无效月份作为虚拟值:

... ON t1.year = i.published_date_year
    AND COALESCE(t1.month, 0) = COALESCE(i.published_date_month, 0)

尽管如此,我几乎看不出这有多大意义。 image是否会在没有月份的情况下存储数据?