Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在WHERE子句中引用列别名_Sql_Sql Server_Tsql_Sql Server 2005 - Fatal编程技术网

Sql 在WHERE子句中引用列别名

Sql 在WHERE子句中引用列别名,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我明白了 “无效列名daysdiff” Maxlogtm是一个日期时间字段。正是这些小事让我发疯 SELECT logcount, logUserID, maxlogtm , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff FROM statslogsummary WHERE daysdiff > 120 通常不能在WHERE子句中引用字段别名。(将其视为在WHERE子句之后应用的整个SELECT包括别名。) 但是,正如其他答案中提到的

我明白了

“无效列名daysdiff”

Maxlogtm是一个日期时间字段。正是这些小事让我发疯

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
通常不能在
WHERE
子句中引用字段别名。(将其视为在
WHERE
子句之后应用的整个
SELECT
包括别名。)

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

括号/子选择:

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

或者查看Adam的答案以获得相同的CTE版本。

如果您想在
WHERE
子句中使用别名,则需要将其包装在子选择中,或者:


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

使用子查询如何(这在Mysql中对我有效)


不重复代码的最有效方法是使用have而不是WHERE

在MySQL中有工作 根据文件:

HAVING子句被添加到SQL中,因为WHERE关键字无法 可以与聚合函数一起使用


您可以引用列别名,但需要使用
CROSS/OUTER APPLY
定义它:

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

SELECT * from (SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
优点:

  • 表达式的单一定义(易于维护/无需复制粘贴)
  • 不需要使用CTE/outerquery包装整个查询
  • 可在
    WHERE/GROUP BY/ORDER BY中引用
  • 可能更好的性能(单次执行)

来到这里时看起来与之类似,但有一个CASE WHEN,并使用where结束,如下所示:
where(CASE WHEN COLUMN1=COLUMN2,然后是'1'或'0'END)=0
也许你可以直接在
where
中使用
DATEDIFF
。 比如:

SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;

对我来说,在WHERE类中使用ALIAS最简单的方法是创建一个子查询并从中进行选择

例如:

SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
干杯,
Kel

对于mysql不确定,但可能需要将别名包装在ticks
`daysdiff`
中。这不可能直接实现,因为按时间顺序,WHERE发生在SELECT之前,这始终是执行链中的最后一步。REFERE-afaik如果select中的别名是一个相关子查询,这将起作用,而CTE解决方案则不起作用。正如Pascal在这里的回答中提到的,您可以使用HAVING子句,它似乎比子查询工作得更快。@Bakhtiyor
HAVING
答案在大多数SQL环境中都不起作用,包括这个问题所涉及的MS-SQL。(在T-SQL中,
拥有
需要一个聚合函数。)您知道这是如何提高效率的吗?使用CTE会有额外的开销吗?CTE只是子查询更漂亮的语法,所以性能与之类似。根据我的经验,对于这样的操作,性能差异并不是我所关心的问题,但是在您的环境中测试它应该相当简单,以查看您的特定表/查询是否会因此受到不利影响,而不是在where子句中专门调用公式。我怀疑您不会注意到差异。在您尝试使用CTE作为子查询之前,CTE非常好。我不得不将它们创建为视图来嵌套它们。我认为这是一个严重的SQL短缺,我认为使用<代码>别名上的< /COD>不是标准的(它确实适用于MySQL)。具体来说,我认为它不适用于SQL Server。SQL Server:
[S0001][207]无效的列名“daysdiff”
SQL Server:
[S0001][8121]HAVING子句中的“day”列无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
值得一提的是,它只在SQL中工作Server@MartinZinovsky问题被标记为
SQLServer
t-sql
:)但问题是关于SQLServer的
SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
WITH Q1 AS (
    SELECT LENGTH(name) AS name_length,
    id,
    name
    FROM any_table
)

SELECT id, name, name_length form Q1 where name_length > 0