如何在PostgreSQL 9.3中检查一个无界范围是否为NULL -确保使用GIST索引



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

我想查询一个WHERE表达式本质上说"范围是NULL(无界)在右边"。怎么写呢?

对于tsrange,我可以执行"tsrange @> timestamp 'infinity'"。但是int8range没有等价的。我认为正确处理int8range的方法也应该是tsrange的方法(不依赖于特定于时间戳的'infinity'处理)。

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

帮助吗?

来自精细手册: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索引。

相关内容

最新更新