如何在 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_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'
【问题讨论】:
【参考方案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
WHERE
在GROUP 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 > 50
的product_brands
并且还会向您显示
每个的计数。
【讨论】:
以上是关于如何在 where 子句中使用临时列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EXECUTE IMMEDIATE 中使用动态 where 子句