【问题标题】:How to address the "alias" in SQL statement如何解决 SQL 语句中的“别名”
【发布时间】:2018-09-03 23:29:25
【问题描述】:

我正在尝试过滤连接结果,但别名 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

提前感谢大家的帮助。

【问题讨论】:

  • 您需要嵌套查询,可以使用公用表表达式 (WITH...) 或派生表 (SELECT ... FROM (SELECT ...))

标签: sql inner-join where alias


【解决方案1】:

您不能在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 (. . .);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2020-11-24
    • 1970-01-01
    • 2012-01-16
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多