2011-10-09 13 views
14

Come faccio a far funzionare tutto questo, funziona senza la Clausola Where, altrimenti con la clausola Where, ottengo l'errore ovvio, ma questo è fondamentalmente ciò che deve essere fatto, qualcuno sa come affrontarlo?Utilizzo di alias in Clausola Where o un'opzione alternativa?

select ID, 
     Name, 
     case T.N 
     when 1 then City1 
     when 2 then City2 
     when 3 then City3 
     end as City, 
     case T.N 
     when 1 then State1 
     when 2 then State2 
     when 3 then State3 
     end as State 
from YourTable 
    cross join (values(1),(2),(3)) as T(N) 

    Where City is NOT Null 
+5

Speriamo che lo scopo di questa query è in modo da poter risolvere il tuo struttura della tabella e metterla in prima forma normale. –

risposta

22

Non è possibile utilizzare l'alias nella clausola WHERE. O ripetere l'espressione (disordinato), oppure mettere il SELECT una sottoquery e poi mettere la clausola WHERE nella query esterna:

SELECT Id, Name, City, State 
FROM 
(
    SELECT 
     ID, 
     Name, 
     CASE T.N 
      WHEN 1 THEN City1 
      WHEN 2 THEN City2 
      WHEN 3 THEN City3 
     END AS City, 
     CASE T.N 
      WHEN 1 THEN State1 
      WHEN 2 THEN State2 
      WHEN 3 THEN State3 
     END AS State 
    FROM YourTable 
    CROSS JOIN (VALUES(1),(2),(3)) AS T(N) 
) T1 
WHERE City IS NOT NULL 
+0

Ha funzionato come un incantesimo, grazie. –

7

Non è possibile utilizzare un alias (da SELECT clausola) in WHERE clausola perché il logical processing order (sezione: Logical Processing Order of the SELECT statement) è WHERE e poi SELECT:

FROM  
ON 
JOIN 
WHERE <-- 
GROUP BY 
WITH CUBE or WITH ROLLUP 
HAVING 
SELECT <-- 
DISTINCT 
ORDER BY <-- 
TOP 

Ma, è possibile utilizzare un alias in ORDER BY:

SELECT h.SalesOrderID, YEAR(h.OrderDate) OrderYear 
FROM Sales.SalesOrderHeader h 
ORDER BY OrderYear; 

Soluzioni: vedere le soluzioni presentate da Mark Byers.

Tibor Karaszi: Why can't we have column alias in ORDER BY?