如何解决这个问题;别名";在SQL语句中

如何解决这个问题;别名";在SQL语句中,sql,inner-join,where,alias,Sql,Inner Join,Where,Alias,我正在尝试筛选联接结果,但别名出现问题cPlace 下面是我的连接,它可以工作,但在WHERE子句中失败。我基本上显示的是ISO国家代码,如果国家是107(美国),则显示国家缩写 SELECT CASE WHEN co.CIDNo = 107 THEN al.State ELSE co.ISO END AS cPlace, al.ALIDNo FROM dbo.AssignedList AS al INNER JOIN dbo.

我正在尝试筛选联接结果,但别名出现问题
cPlace

下面是我的连接,它可以工作,但在
WHERE
子句中失败。我基本上显示的是ISO国家代码,如果国家是107(美国),则显示国家缩写

SELECT 
    CASE 
       WHEN co.CIDNo = 107 THEN al.State ELSE co.ISO 
    END AS cPlace, 
    al.ALIDNo 
FROM 
    dbo.AssignedList AS al
INNER JOIN 
    dbo.Country co ON al.CIDNo = co.CIDNo
-->>> Fails after this point
WHERE 
    al.cPlace IN ('ALB', 'ATG', 'BEN', 'BFA', 'BHS', 'BLM', 'COM', 'Con', 'CT', 'ERI', 'ETH', 'GA', 'GLP', 'GUY', 'HI', 'KAZ', 'LBY', 'MA', 'MCO', 'MLT', 'MN', 'NPL', 'PRI', 'ROM', 'SDN', 'SGP', 'SLE', 'SLV', 'TGO', 'TN', 'UZB', 'WSM')
WHERE
子句前的结果:

cPlace ALIDNo
--------------
DZA     1
AGO     2
BEN     3
CT      4
BFA     5
BDI     6
NY      7

提前感谢大家的帮助

您不能在
on
子句或
where
子句中引用列别名

一种选择是重复逻辑:

SELECT (CASE WHEN co.CIDNo = 107 THEN al.State ELSE co.ISO END) AS cPlace, 
       al.ALIDNo 
FROM dbo.AssignedList al INNER JOIN
     dbo.Country co
     ON al.CIDNo = co.CIDNo
WHERE (CASE WHEN co.CIDNo = 107 THEN al.State ELSE co.ISO END) IN (. . .);
另一个选项是使用子查询/CTE/
apply
定义别名:

SELECT v.cPlace, al.ALIDNo 
FROM dbo.AssignedList al INNER JOIN
     dbo.Country co
     ON al.CIDNo = co.CIDNo CROSS APPLY
     (VALUES ( CASE WHEN co.CIDNo = 107 THEN al.State ELSE co.ISO END )
     ) v(cPlace)
WHERE cPlace IN (. . .);

您需要使用公共表表达式(
WITH…
)或派生表(
SELECT…FROM(SELECT…
)嵌套查询