【问题标题】:How to create an operator in PostgreSQL for the hstore type with an int4range value如何在 PostgreSQL 中为具有 int4range 值的 hstore 类型创建运算符
【发布时间】:2013-07-25 00:47:09
【问题描述】:

我有一个 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 模型。

【问题讨论】:

    标签: postgresql operators postgresql-9.2 database-indexes hstore


    【解决方案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”条目、格式错误的范围值等问题。

    【讨论】:

    • 尝试添加 btree 索引时出现“IMMUTABLE”错误。我的查询将在键 __ 上,其中值 [,]。我不清楚你写的内容是否会作为键上的表达式索引。
    • 或者我需要为每个键创建一个函数吗?这似乎没有意义。基本上有些记录会有“p1”,有些则不会。考虑这是 hstore 中的 EAV 模型。
    • 好的 - 关闭这个问题(不知道你是怎么做到的)并发布另一个问题。解释你真正想要达到的目标,因为这并不清楚。我不太清楚数据结构的用途或您打算如何使用它。
    • 谢谢。请参阅stackoverflow.com/questions/17856503/…,一旦你看到新问题,我将关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2018-12-04
    • 2015-09-14
    • 1970-01-01
    • 2020-03-22
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多