为什么我不能在where子句中使用临时列?

例如,此查询:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand

这会产生两列,一列名为 product_brand ,另一列名为 brand_count brand_count 是即时创建的,总是1或0,具体取决于是否有50个或具有该品牌的产品。

这一切对我来说都是有意义的,除了我不能只选择 brand_count = 1 ,如下面的查询:

Select 
    product_brand, 
   (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
   brand_count = 1 
GROUP BY 
   product_brand

这给了我这个错误:

#1054 - Unknown column 'brand_count' in 'where clause' 
有帮助吗?

解决方案

改为使用 HAVING

Select
    product_brand,
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
  FROM products
  GROUP BY product_brand
  HAVING brand_count = 1

WHERE GROUP BY 之前评估 HAVING 在评估之后进行评估。

其他提示

因为在SQL中,列首先被“选中”。然后“预测”。

您必须使用完整子句,因此您需要:

Select 
  product_brand, 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END)  = 1 
GROUP BY product_brand

对于任何SQL语句中的任何计算字段,这都是相同的。

简化:

Select Max(Points) as Highest where Highest > 10

不起作用,但是:

Select Max(Points) as Highest where Max(Points) > 10

意愿。你的情况也一样。

因为在完成处理之前它不知道该列是什么。

如果要按该名称访问该列,则必须使用子查询,否则您将不必使用您提供的名称来限定该列,重复您的案例陈述。

如果我正确阅读了您的意图,您可以重新编写此查询以阅读:

Select 
 product_brand,
 COUNT(product_brand) AS brand_count 
FROM 
 products 
GROUP BY 
 product_brand
HAVING 
 COUNT(product_brand) > 50

这将为您提供 count>的所有 product_brands 50 ,也会告诉你 每个的计数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top