简而言之,当我执行以下SQL命令时:
SELECT EXTRACT(YEAR FROM pub_date) AS year FROM news_stories
我得到了从2008年到2014年的一大堆年份。
但如果我这样做
SELECT EXTRACT(YEAR FROM pub_date) AS year FROM news_stories WHERE year > 2010
我得到一个空的结果。 我做错了什么?
输出列在 ORDER BY
或 GROUP BY
子句中可见,因为这些列是在计算 SELECT
子句中的表达式后应用的。它们在WHERE
或HAVING
子句中不可见。因此,不能引用输出列名称year
。您必须根据输入列重复表达式。显然,有一个同名的输入列,否则你会得到一个异常。详:
- 如何为 SELECT、WHERE 和 ORDER BY 子句重用结果?
为了使查询速度更快,应使用可优化的谓词:
SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
WHERE pub_date >= '2010-1-1'::date;
这通常更快,因为 Postgres 可以直接将pub_date
中的值与给定值进行比较,而无需先从每一行中提取年份。
更重要的是,pub_date
上的普通索引可以这样使用 - 如果 Postgres 希望该路由更快(仅索引扫描或足够选择性(。
必须有一个名为 year
的列,否则 SQL 将返回错误。 不能在定义别名的 select
或 where
子句中使用别名。
使用子查询或重复表达式:
SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
WHERE EXTRACT(YEAR FROM pub_date) > 2010;
或作为子查询:
select *
from (SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
) n
where year > 2010;
试试这个。不能在 where 子句中使用 alias name
。WHERE clause
在SELECT clause(*)
之前处理。由于您有名为 Year
的列,因此您没有收到错误。
SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
WHERE EXTRACT(YEAR FROM pub_date) > 2010