【问题标题】:Invalid Column Name After Adding Where Clause [duplicate]添加 Where 子句后列名无效[重复]
【发布时间】: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'.

【问题讨论】:

标签: sql ssms


【解决方案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 子句中的值进行处理。
    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多