在我的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'无效,为什么?
答案 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可以更好地规划执行。