简而言之,当我执行以下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
我得到一个空的结果。我做错了什么?
答案 0 :(得分:3)
输出列在ORDER BY
或GROUP BY
子句中可见,因为在评估SELECT
子句中的表达式之后应用。它们在 WHERE
或HAVING
子句中不可见。因此,您无法引用输出列名year
。您必须根据输入列重复表达式。显然,有一个同名的输入列,或者你会得到一个例外。详细说明:
要使您的查询快,您应该使用 sargable 谓词:
SELECT EXTRACT(YEAR FROM pub_date) AS year
FROM news_stories
WHERE pub_date >= '2010-1-1'::date;
这通常更快,因为Postgres可以直接将pub_date
中的值与给定值进行比较,而无需先从每一行中提取年份。
更重要的是,pub_date
上的普通索引可以这种方式使用 - 如果Postgres希望路由更快(仅索引扫描或选择性足够)。
答案 1 :(得分:1)
试试这个。您不能在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
答案 2 :(得分:1)
您必须在数据库中有一个名为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;