你能在SQL WHERE clasue中使用"on-the-fly"列名吗?

Ev.*_*Ev. 3 sql sql-server

我的SQL有点生疏了.

我以为我可以这样做:

SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE dCloseDate > '1990-01-01 07:00:00.000'
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我收到错误:

Invalid column name 'dCloseDate'.
Run Code Online (Sandbox Code Playgroud)

有人知道解决方法吗?我只是想这样做,使我的代码更具可读性/可维护性.

关于为什么我不应该这样做的任何建议也将不胜感激:)

Ric*_*iwi 5

您不能在SQL WHERE子句中使用"on-the-fly"列名.(您可以在ORDER BY子句中.)您必须对其进行子查询,或重复表达式

SELECT * FROM (
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
) SUBQ
WHERE dCloseDate > '1990-01-01 07:00:00.000'
Run Code Online (Sandbox Code Playgroud)

-要么-

SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'
Run Code Online (Sandbox Code Playgroud)

为什么你不应该这样做?

话虽如此,您正在针对需要进行表扫描的列dStartDateTime执行一项功能.始终执行另一方的功能,以便可以针对dStartDateTime(datetime列)上的索引测试找到的值.

SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE dStartDateTime > DATEADD(d, -1 ,'1990-01-01 07:00:00.000')
Run Code Online (Sandbox Code Playgroud)