【问题标题】:Why can't I use filter my WHERE clause on a CASE statement column in SQL Server? [duplicate]为什么我不能在 SQL Server 的 CASE 语句列上使用筛选 WHERE 子句? [复制]
【发布时间】:2014-07-26 14:56:51
【问题描述】:

在我的选择语句中有一个 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中的case语句有什么意义呢?您的所有结果都应在派生区域列中显示“未知”。
  • 脚本比我展示的要多,这个问题没有必要。

标签: sql sql-server case where


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该在 where 子句中重复所有 in´s:

    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-clause 的视图(例如“myview”),然后从视图中选择:

    SELECT * FROM myview WHERE DerivedRegion = 'Unknown'
    

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

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多