簡體   English   中英

如何在 where 子句中使用臨時列

[英]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

WHEREGROUP 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM