WHERE子句中无效的列名错误,使用CASE选择列

Tom*_*han 9 t-sql sql-server case calculated-columns where

我有一个(相当复杂)的SQL语句,我从很多不同的表中选择数据,并应付不良遗留的数据结构,我有几个基于其他列的值是获得它们的值自定义列的.我目前用CASE声明解决了这个问题:

 SELECT
     ...,
     CASE channel
         WHEN 1 THEN channel_1
         WHEN 2 THEN channel_2
         ...
         ELSE 0
     END AS ChannelValue,
     CASE channelu
         WHEN 1 THEN channelu_1
         WHEN 2 THEN channelu_2
         ...
         ELSE '0'
     END AS ChannelWithUnit,
     ...
 FROM 
     ... 
 --rest of statement continues with multiple joins and where/and clauses...
Run Code Online (Sandbox Code Playgroud)

我得到的所有执行在MS SQL Server Management Studio中查询时,我所期望的结果,和列名被列为我在指定AS条款.但是,出于某种原因,我不允许在WHERE语句中使用条件值.如果我加

AND ChannelValue > Limit * p.Percentage / 100
Run Code Online (Sandbox Code Playgroud)

在查询结束时,我在该行上收到错误消息

消息207,级别16,状态1,行152
无效的列名称"ChannelValue"

为什么不允许这样做?我该怎么做呢?

Mar*_*ith 12

SQL语句中唯一有效使用SELECT列表中声明的别名的部分是ORDER BY子句.对于查询的其他部分,您只需重复整个CASE表达式并信任优化器以识别它是相同的.

如果您使用的是SQL2005 +,则可以使用CTE来避免此问题,这有时会有助于提高可读性.

WITH YourQuery As
(

 SELECT
     Limit, 
     Percentage,
     CASE channel
         WHEN 1 THEN channel_1
         WHEN 2 THEN channel_2
         ...
         ELSE 0
     END AS ChannelValue,
     CASE channelu
         WHEN 1 THEN channelu_1
         WHEN 2 THEN channelu_2
         ...
         ELSE '0'
     END AS ChannelWithUnit,
     ...
 FROM 
)

select ...
FROM YourQuery WHERE
ChannelValue > Limit * Percentage / 100
Run Code Online (Sandbox Code Playgroud)


Nik*_*l S 7

您不能ChannelValue在同一select级别的where子句中使用列名.
你必须把这个整体select放在一个子查询中.

select ....
from 
( 
your select query
) as innerSelect
where ChannelValue > Limit * p.Percentage / 100
Run Code Online (Sandbox Code Playgroud)