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)
您不能ChannelValue在同一select级别的where子句中使用列名.
你必须把这个整体select放在一个子查询中.
select ....
from
(
your select query
) as innerSelect
where ChannelValue > Limit * p.Percentage / 100
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9859 次 |
| 最近记录: |