提问人:user990016 提问时间:12/4/2011 最后编辑:Lukasz Szozdauser990016 更新时间:9/24/2022 访问量:309513
引用 WHERE 子句中的列别名
Referring to a Column Alias in a WHERE Clause
问:
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
我明白了
“无效的列名称 daysdiff”。
Maxlogtm 是一个日期时间字段。正是这些小事让我发疯。
答:
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
通常,您不能在子句中引用字段别名。(将其视为整个(包括别名)在子句之后应用。WHERE
SELECT
WHERE
但是,正如其他答案中提到的,您可以强制 SQL 处理在子句之前处理。这通常使用括号来强制执行逻辑操作顺序,或者使用通用表表达式 (CTE) 来完成:SELECT
WHERE
括号/子选择:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
或者查看 Adam 的答案以获取相同的 CTE 版本。
评论
HAVING
HAVING
如果要在子句中使用别名,则需要将其包装在子选择或 CTE 中:WHERE
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
评论
如果您不想在 CTE 中列出所有列,另一种方法是使用外部应用
:
select
s.logcount, s.logUserID, s.maxlogtm,
a.daysdiff
from statslogsummary as s
outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120
使用子查询怎么样(这在Mysql中对我有用)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
在不重复代码的情况下执行此操作的最有效方法是使用 HAVING 而不是 WHERE
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
评论
HAVING
[S0001][207] Invalid column name 'daysdiff'
[S0001][8121] Column 'day' is invalid in the HAVING clause because it is not contained in either an aggregate function or the GROUP BY clause.
Invalid column name '<name>'.
HAVING 在 MySQL 中工作 根据文档:
HAVING 子句已添加到 SQL 中,因为 WHERE 关键字无法 与聚合函数一起使用。
评论
您可以引用列别名,但您需要使用以下命令来定义它:CROSS/OUTER APPLY
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;
优点:
- 表达式的单一定义(更易于维护/无需复制粘贴)
- 无需使用 CTE/outerquery 包装整个查询
- 可以参考
WHERE/GROUP BY/ORDER BY
- 可能更好的性能(单次执行)
评论
sql-server
t-sql
来到这里看起来与此类似,但带有 CASE WHEN,并像这样结束使用 where:也许您可以直接使用 in。
像这样:WHERE (CASE WHEN COLUMN1=COLUMN2 THEN '1' ELSE '0' END) = 0
DATEDIFF
WHERE
SELECT logcount, logUserID, maxlogtm
FROM statslogsummary
WHERE (DATEDIFF(day, maxlogtm, GETDATE())) > 120
对我来说,在 WHERE 子句中使用 ALIAS 的最简单方法是创建一个子查询并从中进行选择。
例:
WITH Q1 AS (
SELECT LENGTH(name) AS name_length,
id,
name
FROM any_table
)
SELECT id, name, name_length FROM Q1 WHERE name_length > 0
使用 HAVING 子句,因为 WHERE 关键字不能与聚合函数一起使用。
SELECT
logcount,
logUserID,
maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
下一个:C 用户输入零星无效结果
评论
`daysdiff`