2010-12-30 6 views
2

Ist es möglich, Datensätze in SQL Server mithilfe eines Ergebnisausdrucks (Gewichtsklasse) aus einem CASE Ausdruck in der WHERE -Klausel zu filtern? Ich kann sie nicht arbeiten, weil ich einen Fehler zu sagen:Verwenden Sie "Ergebnis Ausdruck" aus CASE-Ausdruck in WHERE-Klausel

Ungültiger Spaltenname '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 

Dies ist, wie ich will:

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' 

Antwort

6

SQL-Server eine Tabelle Alias ​​erfordert:

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

Diese Antwort ist nicht wirklich korrekt, da OP einen Alias ​​verwendet. Der Unterschied besteht darin, dass Sie eine Unterabfrage verwenden –

0

ich glaube, Sie HAVING verwenden anstelle von 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:

By the way, warum Sie nicht nur verwenden:

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

Im Gegensatz zu MySQL Sie können keine Spaltenaliasnamen in der 'have'-Klausel in SQL Server verwenden. +1 Für die zweite Abfrage, die möglicherweise effizienter ist, da sie einen Indexbereich Suchvorgang statt eines gesamten Scanvorgangs ermöglicht. –

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

fügen Sie bitte den erforderlichen Tabellenalias hinzu. Tag sagt SQL-Server. –