Tsql 在Where子句或替代选项中使用别名?

Tsql 在Where子句或替代选项中使用别名?,tsql,sql-server-2008,Tsql,Sql Server 2008,我该怎么做呢?没有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 t

我该怎么做呢?没有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

不能在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
您不能在
WHERE
子句中使用别名(来自
SELECT
子句),因为(SELECT语句的
逻辑处理顺序部分)是
WHERE
,然后
SELECT

FROM    
ON
JOIN
WHERE <--
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT <--
DISTINCT
ORDER BY <--
TOP
解决方案:参见Mark Byers提出的解决方案


希望此查询的目的是,您可以修复表结构并将其转换为第一个标准形式。
SELECT  h.SalesOrderID, YEAR(h.OrderDate) OrderYear
FROM    Sales.SalesOrderHeader h
ORDER BY OrderYear;