如何在 where 子句中使用临时列

Posted

技术标签:

【中文标题】如何在 where 子句中使用临时列【英文标题】:How to use a temp column in the where clause 【发布时间】:2010-10-12 11:06:04 【问题描述】:

为什么不能在 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_countbrand_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' 

【问题讨论】:

【参考方案1】:

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

如果您想使用该名称访问该列,则必须使用子查询,否则您将不得不在没有您给它的名称的情况下限定该列,重复您的 case 语句。

【讨论】:

【参考方案2】:

改用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

WHEREGROUP BY 之前评估HAVING 在之后进行评估。

【讨论】:

@thorn:它在 mysql 中一直对我有用。也许您的查询中还有其他问题?您正在运行哪个版本的 MySQL,您是否启用了其中一个严格选项? 对不起。我将 MySQL 与 MS SQL Server 混淆了。【参考方案3】:

因为在 SQL 中,列首先是“选定的”,然后是“投影的”。

【讨论】:

这比我试图解释的要简洁得多:) 感谢 TheTXI :P,为他们终于获得回报的 DB 设计课程欢呼。【参考方案4】:

你必须使用完整的子句,所以你需要:

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

会的。你的情况也一样。

【讨论】:

【参考方案5】:

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

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

这将为您提供所有具有count > 50product_brands 并且还会向您显示 每个的计数。

【讨论】:

以上是关于如何在 where 子句中使用临时列的主要内容,如果未能解决你的问题,请参考以下文章

Linq - 如何在 where 子句中使用 2 列

如何在 SQL 的 WHERE 子句中动态调用列

如何在 EXECUTE IMMEDIATE 中使用动态 where 子句

如何使用数千个 WHERE 子句优化 SQL 查询

SQL 如何获取 XML 数据列的值并在 where 子句中使用它

如何在oracle的where子句中使用特殊字符'_'