2011-10-09 24 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?