1

我在 PG 9.3 中使用范围数据类型(启用了 btree_gist,但我认为这并不重要)。我有包含这些范围列的 GIST 索引。有些是int8range,有些是tsrange。

我想使用 WHERE 表达式进行查询,基本上说“右侧的范围为 NULL(无界)”。我该怎么写?

对于 tsrange,我可以做“tsrange @> timestamp 'infinity'”。但是 int8range 没有等价物。而且我认为为 int8range 正确执行此操作的方法也应该是 tsrange 的方法(不依赖于特定于时间戳的“无穷大”处理)。

该表达式应该可用于 GIST 索引(即属于这些范围类型的默认运算符类)。

帮助?

4

1 回答 1

1

来自精美手册:http ://www.postgresql.org/docs/9.4/static/functions-range.html

upper_inf功能会告诉你。

# select upper_inf(int8range(1, null));
 upper_inf 
-----------    
 t
(1 row)

# select upper_inf(int8range(1, 2));
 upper_inf 
-----------
 f
(1 row)

如果您需要对此进行查询,我认为索引不会对您有所帮助。 http://www.postgresql.org/docs/9.4/static/rangetypes.html

A GiST or SP-GiST index can accelerate queries involving these range
operators: =, &&, <@, @>, <<, >>, -|-, &<, and &> (see Table 9-47 
for more information).

不过,您可以创建一个有助于该查询的部分索引。例如

# create table foo (id int primary key, bar int8range);  
CREATE TABLE
# create index on foo(bar) where upper_inf(bar) = true;
CREATE INDEX
# \d foo
      Table "freshop.foo"
 Column |   Type    | Modifiers 
--------+-----------+-----------
 id     | integer   | not null
 bar    | int8range | 
Indexes:
    "foo_pkey" PRIMARY KEY, btree (id)
    "foo_bar_idx" btree (bar) WHERE upper_inf(bar) = true

然后,如果您放入upper_inf(bar) = true查询中,优化器应该了解使用foo_upper_inf_idx索引。

于 2015-08-06T22:42:52.470 回答