首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您可以在SQL WHERE clasue中使用"on-the-fly“列名吗?

您可以在SQL WHERE clasue中使用"on-the-fly“列名吗?
EN

Stack Overflow用户
提问于 2011-02-04 10:59:21
回答 3查看 850关注 0票数 3

我对SQL有点生疏了。

我想我可以这样做:

代码语言:javascript
复制
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE dCloseDate > '1990-01-01 07:00:00.000'

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

代码语言:javascript
复制
Invalid column name 'dCloseDate'.

有人知道解决这个问题的方法吗?我只是想让我的代码更具可读性和可维护性。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-04 11:06:12

您不能在SQL WHERE子句中使用“即时”列名。(可以在ORDER BY子句中使用。)必须对其进行子查询,或重复表达式

代码语言:javascript
复制
SELECT * FROM (
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
) SUBQ
WHERE dCloseDate > '1990-01-01 07:00:00.000'

-或者-

代码语言:javascript
复制
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'

为什么你不应该这么做呢?

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

代码语言:javascript
复制
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem 
WHERE dStartDateTime > DATEADD(d, -1 ,'1990-01-01 07:00:00.000')
票数 5
EN

Stack Overflow用户

发布于 2011-02-04 11:03:43

不幸的是,您不能使用在AS子句中给出的名称。相反,您必须在WHERE子句中重复该表达式:

代码语言:javascript
复制
SELECT *, DATEADD(d, 1 ,dStartDateTime) AS dCloseDate
FROM EventItem 
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'

这不会增加可读性或可维护性。但这是top做到这一点的唯一方法。

票数 1
EN

Stack Overflow用户

发布于 2011-02-04 11:04:59

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4894133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档