2010-12-30 1 views
2

Est-il possible de filtrer les enregistrements dans SQL Server en utilisant une expression de résultat (weight_class) d'une expression CASE dans la clause WHERE? Je ne peux pas le faire fonctionner parce que je reçois une erreur disant:Utiliser expression de résultat à partir de l'expression CASE dans la clause WHERE

nom de colonne non valide 'weight_class'

code:

SELECT 
    first_name, last_name, 
    weight_class = CASE 
         WHEN weight < 172 THEN 'Welterweight' 
         WHEN weight <= 192 THEN 'Middleweight' 
         WHEN weight <= 214 THEN 'Light heavyweight' 
         WHEN weight <= 220 THEN 'Cruiserweight' 
         ELSE 'Heavyweight' 
        END 
FROM 
    athletes 

Voilà comment je veux faire:

SELECT 
    first_name, last_name, 
    weight_class = CASE 
         WHEN weight < 172 THEN 'Welterweight' 
         WHEN weight <= 192 THEN 'Middleweight' 
         WHEN weight <= 214 THEN 'Light heavyweight' 
         WHEN weight <= 220 THEN 'Cruiserweight' 
         ELSE 'Heavyweight' 
        END 
FROM 
    athletes 
WHERE 
    weight_class = 'Cruiserweight' 

Répondre

6

SQL Server nécessite un alias de table:

SELECT * from 
(
SELECT first_name, last_name, 
     CASE 
WHEN weight<172 THEN 'Welterweight' 
WHEN weight<=192 THEN 'Middleweight' 
WHEN weight<=214 THEN 'Light heavyweight' 
WHEN weight<=220 THEN 'Cruiserweight' 
    ELSE 'Heavyweight' 
    END AS weight_class 
    FROM athletes 
) as t 
WHERE weight_class = 'Cruiserweight' 
+1

Cette réponse n'est pas vraiment correcte car OP utilise un alias. La différence est que vous utilisez une sous-requête –

0

Je pense que vous devrez utiliser HAVING au lieu de WHERE :

SELECT first_name, last_name, weight_class = 
CASE 
WHEN weight<172 THEN 'Welterweight' 
WHEN weight<=192 THEN 'Middleweight' 
WHEN weight<=214 THEN 'Light heavyweight' 
WHEN weight<=220 THEN 'Cruiserweight' 
ELSE 'Heavyweight' 
END 
FROM athletes 
HAVING weight_class = 'Cruiserweight' 

EDIT:

D'ailleurs, pourquoi ne pas utiliser simplement:

SELECT first_name, last_name, weight_class = 
CASE 
WHEN weight<172 THEN 'Welterweight' 
WHEN weight<=192 THEN 'Middleweight' 
WHEN weight<=214 THEN 'Light heavyweight' 
WHEN weight<=220 THEN 'Cruiserweight' 
ELSE 'Heavyweight' 
END 
FROM athletes 
WHERE weight > 214 AND weight <= 200 
+0

Contrairement à MySQL Vous ne pouvez pas utiliser d'alias de colonne dans la clause 'having' de SQL Server. +1 Pour la deuxième requête, qui sera potentiellement plus efficace car elle permet une recherche de plage d'index plutôt qu'une analyse complète. –

2
SELECT * from 
(
SELECT first_name, last_name, 
     CASE 
WHEN weight<172 THEN 'Welterweight' 
WHEN weight<=192 THEN 'Middleweight' 
WHEN weight<=214 THEN 'Light heavyweight' 
WHEN weight<=220 THEN 'Cruiserweight' 
    ELSE 'Heavyweight' 
    END AS weight_class 
    FROM athletes 
) t 
WHERE weight_class = 'Cruiserweight' 
+0

Veuillez ajouter l'alias de table requis. Tag dit SQL-Server. –

Questions connexes