Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复合键类型上的PostgreSQL索引+;范围_Postgresql_Indexing_Composite_Postgresql 9.6_Composite Types - Fatal编程技术网

复合键类型上的PostgreSQL索引+;范围

复合键类型上的PostgreSQL索引+;范围,postgresql,indexing,composite,postgresql-9.6,composite-types,Postgresql,Indexing,Composite,Postgresql 9.6,Composite Types,考虑以下SQL: create type kv AS ( key int4, val int4range ); create table test ( id serial primary key, data kv[] not null ); insert into test (data) values (array[(1, '[10,20]'),(2, '[30,40]')]::kv[]) 我希望能够查询(伪代码)“给我所有ID,其中键是1,其值重叠5到15,键是2

考虑以下SQL:

create type kv AS
(
  key   int4,
  val   int4range
);

create table test
(
  id serial primary key,
  data kv[] not null
);

insert into test (data)
values (array[(1, '[10,20]'),(2, '[30,40]')]::kv[])
我希望能够查询(伪代码)“给我所有ID,其中键是
1
,其值重叠
5到15
,键是
2
,其值重叠
38到60
,等等

这可能吗

我添加了以下内容以允许对值进行索引,但它不正确,因为它忽略了键:

CREATE OPERATOR CLASS gin_int4range_ops
    DEFAULT FOR TYPE int4range[] USING gin AS
        OPERATOR        1       =(anyrange,anyrange),
        FUNCTION        1       lower(anyrange),
        FUNCTION        2       upper(anyrange),
        FUNCTION        3       isempty(anyrange),
        FUNCTION        4       lower_inc(anyrange),
        FUNCTION        5       upper_inc(anyrange);

create index ix_test on test using gin (data->val gin_int4range_ops); << error & needs to include the key
创建操作员类gin\u int4range\u ops
使用gin作为类型int4range[]的默认值
运算符1=(任意范围,任意范围),
功能1降低(任何范围),
功能2上限(任意范围),
函数3为空(任意范围),
功能4 lower_inc(任何范围),
功能5 upper_inc(任何范围);

使用gin(data->val gin_int4range_ops)在测试中创建索引ix_test;注意:将列命名为与其类型相同的列至少会让人困惑。这很公平。我编辑了它,我感觉您的
键实际上是一个自然/候选键(duh!),因此它不应该隐藏在UDT blob中。它违反1NF(和2NF)在标准形式下,这显然很简单。我试图利用PG的数组和外来索引。通过函数和触发器实现规范化很简单。