添加 Where 子句后列名无效[重复]
Posted
技术标签:
【中文标题】添加 Where 子句后列名无效[重复]【英文标题】:Invalid Column Name After Adding Where Clause [duplicate] 【发布时间】:2018-06-08 13:33:57 【问题描述】:我正在尝试运行查询,并且在运行以下查询时运行良好:
SELECT 'Delivery' activity_type,
left(pod.ID1, charindex('*', pod.ID1) - 1) load_number,
DATEADD(hour, CONVERT(INT, LEFT(CONVERT(VARCHAR(2), ISNULL(Dock_In_Time,
'0')), 2)), CONVERT(DATETIME, ID2)) expected_arrival
FROM [Server].[Database].[dbo].[POD_Sched_Del] pod
--WHERE expected_arrival between '6/7/18' and '6/8/18'
ORDER BY expected_arrival asc, activity_type
当我在注释中添加以下代码行时:
--WHERE expected_arrival between '6/7/18' and '6/8/18'
我收到以下错误消息:
Msg 207, Level 16, State 3, Line 37 Invalid column name 'expected_arrival'.
Msg 207, Level 16, State 3, Line 37 Invalid column name 'expected_arrival'.
【问题讨论】:
Logical processing order of the SELECT statement Referring to a Column Alias in a WHERE Clause 请添加您的 DBMS 在 WHERE 子句中,您不能使用别名,而是使用真实字段。所以对你来说:DATEADD(hour, CONVERT(INT, LEFT(CONVERT(VARCHAR(2), ISNULL(Dock_In_Time, '0')), 2)), CONVERT(DATETIME, ID2)) 之间... 【参考方案1】:将原始查询包装为派生表(子查询),然后您可以拥有 WHERE 子句条件:
select *
from
(
SELECT 'Delivery' activity_type,
left(pod.ID1, charindex('*', pod.ID1) - 1) load_number,
DATEADD(hour, CONVERT(INT, LEFT(CONVERT(VARCHAR(2), ISNULL(Dock_In_Time,
'0')), 2)), CONVERT(DATETIME, ID2)) expected_arrival
FROM [Server].[Database].[dbo].[POD_Sched_Del] pod
) dt
WHERE expected_arrival between '6/7/18' and '6/8/18'
ORDER BY expected_arrival asc, activity_type
【讨论】:
【参考方案2】:您不能在 where 子句中使用别名,该列在表中不存在。
您可以将 where 子句更改为您要别名的列:
WHERE DATEADD(hour, CONVERT(INT, LEFT(CONVERT(VARCHAR(2), ISNULL(Dock_In_Time,
'0')), 2)), CONVERT(DATETIME, ID2)) between '6/7/18' and '6/8/18'
【讨论】:
从DATEADD(hour,...
开始的整个表达式就是expected_arrival
。在我看来,向日期添加或删除一些小时数可能会改变它属于哪一天,因此如果您只是使用ID2
,过滤器可能正确也可能不正确。
抱歉错过了整个计算,我更新了我的解决方案,但由于要做的事情太多,这不是最好的路线,带有子选择的其他解决方案在所有功能被对 where 子句中的值进行处理。以上是关于添加 Where 子句后列名无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL CONCAT 停止使用 WHERE 子句处理连接表 [重复]