2011-10-09 28 views
14

我如何得到這個工作,它沒有Where子句,否則與Where子句,我得到明顯的錯誤,但基本上需要做什麼,任何人都知道如何處理這個?在哪裏條款或替代選項中使用別名?

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

希望這個查詢的目的是使您可以修復你的表結構,並把它變成第一範式。 –

回答

22

您不能在WHERE子句中使用別名。重複上述表達式(亂),或者把你的SELECT子查詢,然後把WHERE子句中的外部查詢:

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

工作就像一個魅力,謝謝。 –

7

不能使用別名(從SELECT條款)在WHERE條款,因爲logical processing order(部分:Logical Processing Order of the SELECT statement)是WHERE然後SELECT

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

但是,你可以在ORDER BY使用別名:

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

解決方案:請參閱由Mark Byers提供的解決方案。

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