每当在SELECT语句之后编写CASE语句时,我经常看到CASE语句在SQL中写入GROUP BY。这是一个规则吗?或者,如果它具有一定的意义,那么何时应该在SQL中使用GROUP BY中的CASE语句?
例如
*
SELECT supplier_id,
CASE
WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
END
FROM suppliers;
GROUP BY supplier_id
CASE
WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
END*
当我删除在GROUP BY中编写的CASE语句时,查询不会产生所需的结果。为什么会这样?
答案 0 :(得分:3)
大多数数据库引擎都有聚合查询的要求。 select
中的所有列都必须位于group by
子句中或包含在聚合函数中(例如min()
,max()
等)。
这个要求在两种情况下放宽了。 MySQL将允许未聚合的列作为扩展。它选择一个任意值。 SQL标准允许您按表中的唯一ID进行分组,然后引用其他列(技术上称为"功能相关")。
因此,在大多数数据库中,从case
中删除group by
都会产生错误。在MySQL中,它将为每个supplier_id
返回一行,并为第二列提供任意值。
对于您问题中的查询,写起来更容易:
SELECT distinct supplier_id,
(CASE WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
END)
FROM suppliers;