为什么我不能在SQL Server的CASE语句列中使用filter my WHERE子句?

参见英文答案 > Using an Alias in a WHERE clause                                    5个
在我的select语句中有一个CASE WHEN THEN ELSE END AS语句,我无法在WHERE子句中进行过滤.我不明白为什么这会成为一个问题,有人可以解决这个问题吗?

SELECT        
CASE 
    WHEN m.Country IN ('CANADA', 'UNITED STATES', 'USA', 'MEXICO') THEN 'NA' 
WHEN m.Country IN ('BRAZIL') THEN 'JD2' 
    WHEN m.Country IN ('NZ', 'NEW ZEALAND', 'AUSTRALIA', 'AUSTRALASIA') THEN 'ANZ' 
ELSE 'Unknown' 
    END AS DerivedRegion,
    m.ID,
    m.[Account Name], 
m.[Display Name], 
m.[Last Name], 
m.[First Name]
FROM dbo.Users AS m
WHERE DerivedRegion = 'Unknown'

有WHERE子句给我错误:列名’DerivedRegion’无效,为什么?

最佳答案
在SELECT之前处理WHERE.它不知道DerviedRegion在那一点上是什么.在这种情况下,我建议使用NOT IN来排除国家/地区列表.但是,如果你真的想使用你的CASE,你可以做这样的事情

SELECT *
FROM
(
    SELECT        
        CASE 
            WHEN m.Country IN ('CANADA', 'UNITED STATES', 'USA', 'MEXICO') THEN 'NA' 
            WHEN m.Country IN ('BRAZIL') THEN 'JD2' 
            WHEN m.Country IN ('NZ', 'NEW ZEALAND', 'AUSTRALIA', 'AUSTRALASIA') THEN 'ANZ' 
            ELSE 'Unknown' 
        END AS DerivedRegion,
        m.ID,
        m.[Account Name], 
        m.[Display Name], 
        m.[Last Name], 
        m.[First Name]
    FROM dbo.Users AS m
) AS x
WHERE x.DerivedRegion = 'Unknown'

查看MSDN并向下滚动到SELECT语句的逻辑处理顺序,以查看处理查询的顺序.

转载注明原文:为什么我不能在SQL Server的CASE语句列中使用filter my WHERE子句? - 代码日志