创建计算值的索引

Lon*_*Rob 3 sql postgresql

我有一个表sales被记录year如下:

id year sales
1  2001 10
2  2002 20
3  2003 30
Run Code Online (Sandbox Code Playgroud)

我要加入自己的桌子,以便sales_difference从一年到下一年:

SELECT s1.*, s1.sales - s2.sales AS sales_difference
FROM sales s1, sales s2
WHERE s1.year = s2.year + 1
Run Code Online (Sandbox Code Playgroud)

这个查询运行得很慢,所以我想创建一个索引year + 1.根据PostgreSQL文档,您可以在表达式上创建索引,例如:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Run Code Online (Sandbox Code Playgroud)

所以我尝试这样做:

CREATE INDEX sales_year_plus_one on sales (year + 1);
Run Code Online (Sandbox Code Playgroud)

这给了我:

ERROR:  syntax error at or near "+"
LINE 1: ...sales_year_plus_one on sales (year + 1);
                                              ^
Run Code Online (Sandbox Code Playgroud)

为什么不允许这种特殊表达?

Glo*_*del 5

您需要将表达式括在一组额外的括号中:

CREATE INDEX sales_year_plus_one on sales ((year + 1));
Run Code Online (Sandbox Code Playgroud)

请参阅文档中的摘录:

CREATE INDEX命令的语法通常需要在索引表达式周围编写括号,如第二个示例所示.当表达式只是函数调用时,可以省略括号,如第一个示例中所示.