为了账号安全,请及时绑定邮箱和手机立即绑定

引用WHERE子句中的列别名

引用WHERE子句中的列别名

白板的微信 2019-07-02 17:19:36
引用WHERE子句中的列别名SELECT logcount, logUserID, maxlogtm   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiffFROM statslogsummaryWHERE daysdiff > 120我得到“无效列名daysdiff”。Maxlogtm是一个datetime字段。是这些小事让我发疯。
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiffFROM statslogsummaryWHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

通常,您不能引用WHERE条款。(把它想象成整个SELECT包括别名,则在WHERE条款)

但是,正如其他答案中提到的,您可以强制sql处理SELECT将在WHERE条款。这通常使用括号强制执行逻辑操作顺序,或者使用公共表达式(CTE):

括号/子选择:

SELECT
   *FROM(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff   FROM statslogsummary   
) as innerTableWHERE daysdiff > 120

或者看亚当的答案,一个相同的CTE版本。


查看完整回答
反对 回复 2019-07-02
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

如果要在WHERE子句中,您需要将其包装在子SELECT中,或CTE:


WITH LogDateDiff AS

(

   SELECT logcount, logUserID, maxlogtm

      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff

   FROM statslogsummary

)

SELECT logCount, logUserId, maxlogtm, daysdiff

FROM LogDateDiff

WHERE daysdiff > 120


查看完整回答
反对 回复 2019-07-02
?
绝地无双

TA贡献1946条经验 获得超4个赞

如果不想列出CTE中的所有列,另一种方法是使用outer apply:

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdifffrom statslogsummary as s    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as awhere a.daysdiff > 120


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 664 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信