2

我有一个带有 HSTORE 列“ext”的表,其中值是 int4range。一个例子:

"p1"=>"[10, 18]", "p2"=>"[24, 32]", "p3"=>"[29, 32]", "p4"=>"[18, 19]"

但是,当我尝试对此创建表达式索引时,出现错误:

CREATE INDEX ix_test3_p1
ON test3
USING gist
(((ext -> 'p1'::text)::int4range));

错误:数据类型文本没有访问方法“gist”的默认运算符类 SQL 状态:42704 提示:您必须为索引指定运算符类或为数据类型定义默认运算符类。

如何为此创建运算符?

笔记

每条记录都可能有自己唯一的一组键。每个键代表一个属性,值代表值范围。所以并不是所有的记录都会有“p1”。考虑这是 hstore 中的 EAV 模型。

4

1 回答 1

1

我没有收到该错误 - 我收到“索引表达式中的函数必须标记为 IMMUTABLE”

CREATE TABLE ht (ext hstore);
INSERT INTO ht VALUES ('p1=>"[10,18]"'), ('p1=>"[99,99]"');
CREATE INDEX ht_test_idx ON ht USING GIST ( ((ext->'p1'::text)::int4range) );
ERROR:  functions in index expression must be marked IMMUTABLE

CREATE FUNCTION foo(hstore) RETURNS int4range LANGUAGE SQL AS $$ SELECT ($1->'p1')::int4range; $$ IMMUTABLE;
CREATE INDEX ht_test_idx ON ht USING GIST ( foo(ext) );
SET enable_seq_scan=false;
EXPLAIN SELECT * FROM ht WHERE foo(ext) = '[10,19)';
                              QUERY PLAN                               
-----------------------------------------------------------------------
 Index Scan using ht_test_idx on ht  (cost=0.25..8.52 rows=1 width=32)
   Index Cond: (foo(ext) = '[10,19)'::int4range)

我猜演员表不是一成不变的,因为您可以将范围的默认格式从包含...排除“[...)”更改为其他内容。不过,您大概不会这样做。

显然,您会希望您的真实函数能够处理诸如丢失“p1”条目、格式错误的范围值等问题。

于 2013-07-25T09:12:44.083 回答