[英]How to use a temp column in the where clause
為什么不能在 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 個或具有該品牌的產品。
所有這些對我來說都是有意義的,除了我不能 select 僅當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
將要。 在你的情況下也是一樣的。
因為在完成處理之前它不知道該列是什么。
如果您想按該名稱訪問該列,則必須使用子查詢,否則您將不得不在沒有您給它的名稱的情況下限定該列,重復您的 case 語句。
如果我正確閱讀了您的意圖,您可以重新編寫此查詢以讀取:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
這將為您提供count > 50
的所有product_brands
,並且還會向您顯示每個產品的計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.