SELECT查询新增可为空的description列时如何避免GROUP BY NULL
解决方案
你可以直接在SELECT列表中新增po.description字段,不需要担心NULL值对GROUP BY的影响,两种常用实现方式如下:
方案1:直接将description加入GROUP BY(全数据库通用)
因为Posts.id是表主键,同一个id对应的description是唯一值,哪怕为NULL也不会导致分组结果异常,直接加到GROUP BY列表即可,SQL修改后如下:
SELECT po.id, po.title, po.description, CONVERT(varchar, po.pDate, 104) AS pDate, pt.type, us.userName, SUM(CASE WHEN vt.isLike = 1 THEN 1 ELSE 0 END) AS upvotes, SUM(CASE WHEN vt.isLike = 0 THEN 1 ELSE 0 END) AS downvotes FROM Posts po INNER JOIN PostType pt ON po.typeId = pt.id INNER JOIN Users us ON po.userId = us.id LEFT OUTER JOIN Votes vt ON vt.postId = po.id GROUP BY po.id, po.pDate, po.title, po.description, pt.type, us.userName;
如果需要把NULL的description替换为空字符串显示,可以改成COALESCE(po.description, '') AS description。
方案2:用聚合函数包裹description(无需加入GROUP BY)
如果你不想在GROUP BY里新增字段,可以用任意不改变原值的聚合函数包裹description,因为同一个帖子的description只有一个值,聚合后结果和原值完全一致,自然也不需要对NULL的description做GROUP BY操作:
SELECT po.id, po.title, MAX(po.description) AS description, -- 也可以替换为MIN(po.description),需要处理NULL的话用COALESCE(MAX(po.description), '') CONVERT(varchar, po.pDate, 104) AS pDate, pt.type, us.userName, SUM(CASE WHEN vt.isLike = 1 THEN 1 ELSE 0 END) AS upvotes, SUM(CASE WHEN vt.isLike = 0 THEN 1 ELSE 0 END) AS downvotes FROM Posts po INNER JOIN PostType pt ON po.typeId = pt.id INNER JOIN Users us ON po.userId = us.id LEFT OUTER JOIN Votes vt ON vt.postId = po.id GROUP BY po.id, po.pDate, po.title, pt.type, us.userName;
补充说明
NULL值在GROUP BY中会被归为同一组,但你的分组核心维度是帖子主键po.id,同一个id下不可能出现多个不同的description值,所以哪怕description为NULL也不会导致分组结果错误,不需要额外做特殊处理。
内容的提问来源于stack exchange,提问作者Shalev Sror
相关产品推荐
相关产品推荐

