你能在SQL WHERE子句中使用“on-the-fly”列名吗?

时间:2011-02-04 02:59:21

标签: sql sql-server

我的SQL有点生疏。

我以为我可以这样做:

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

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

Invalid column name 'dCloseDate'.

有人知道这方面的方法吗?我只是想这样做以使我的代码更具可读性/可维护性。

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

3 个答案:

答案 0 :(得分: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'

-OR -

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

为什么你不应该这样做?

话虽如此,您正在对您的dStartDateTime列执行一项功能,该列需要表扫描。始终执行另一方的功能,以便可以根据dStartDateTime(日期时间列)上的索引测试找到的值。

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

答案 1 :(得分:1)

很遗憾,您无法使用您在AS子句中提供的名称。相反,您必须在WHERE子句中重复表达式:

SELECT *, DATEADD(d, 1 ,dStartDateTime) AS dCloseDate
FROM EventItem 
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'

这不会增加可读性或可维护性。但这是顶级的唯一方式。

答案 2 :(得分:0)

很抱歉,但您不能在where子句(或group bys或order bys)中引用列别名(在您的示例中为dCloseDate)。如果你/我们可以,这将是很好的,但MS SQL不支持它。