添加 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 子句处理连接表 [重复]

在 OR 子句 SQL 中使用别名 [重复]

ORA-01839“日期对于指定的月份无效”对于 where 子句中的 to_date

Oracle,根据表名生成Where子句

查询五子句

select 子句中的内联查询与 where 子句中的连接之间的差异 [重复]