Как использовать временный столбец в предложении where - PullRequest
8 голосов
/ 10 марта 2009

Почему я не могу использовать временный столбец в предложении 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' 

Ответы [ 5 ]

14 голосов
/ 10 марта 2009

Используйте 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 оценивается после.

2 голосов
/ 10 марта 2009

Вы должны использовать полное предложение, поэтому вам потребуется:

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

будет. То же самое в вашем случае.

2 голосов
/ 10 марта 2009

Поскольку в SQL столбцы сначала «выбираются», а затем «проецируются».

0 голосов
/ 10 марта 2009

Если я правильно прочитал ваше намерение, вы можете переписать этот запрос следующим образом:

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

Это даст вам все product_brands, которые имеют count > 50, а также покажет вам количество для каждого.

0 голосов
/ 10 марта 2009

Потому что он не знает, что это за столбец, пока не завершит обработку.

Если вы хотите получить доступ к столбцу с таким именем, вам нужно будет использовать подзапрос, в противном случае вам нужно будет указать столбец без имени, которое вы ему дали, повторив оператор case.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...