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

时间:2014-06-05 14:41:33

标签: sql sql-server case where

在我的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'无效,为什么?

2 个答案:

答案 0 :(得分:11)

WHERE之前处理

SELECT。它不知道那时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语句的逻辑处理顺序,以查看处理查询的顺序。

答案 1 :(得分:0)

您应该重复in子句中的所有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 
    m.Country NOT IN ('CANADA', 'UNITED STATES', 'USA', 'MEXICO', 'BRAZIL', 'NZ', 'NEW ZEALAND', 'AUSTRALIA', 'AUSTRALASIA')

其他解决方案可能是:将查询保存为不带where - 子句的视图(例如“myview”),然后从视图中选择:

SELECT * FROM myview WHERE DerivedRegion = 'Unknown'

在这种情况下,SQL Server可以更好地规划执行。