首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres:错误:运算符不存在:执行子查询时初始化<< inet[]

Postgres:错误:运算符不存在:执行子查询时初始化<< inet[]
EN

Stack Overflow用户
提问于 2016-06-29 04:57:45
回答 0查看 616关注 0票数 1

当我在postgres上询问给定的ip (inet类型)是否在一个inet数组中时,我遇到了一个问题。我将一步一步地提供我正在做的事情。

首先,我创建了第一个表,它将包含要包含在inet块中的IP。

代码语言:javascript
复制
CREATE TABLE test_ips (
    id text,
    ip inet
);

INSERT INTO test_ips VALUES ('yeah', '134.53.100.2');
INSERT INTO test_ips VALUES ('nope', '135.53.100.2');

然后,我创建了一个包含inet块的表。

代码语言:javascript
复制
CREATE TABLE test_blocks (
    id    text PRIMARY KEY,
    block  inet[] NOT NULL
);

INSERT INTO test_blocks VALUES ('one', '{134.53.25.0/24,134.53.0.0/16}');
INSERT INTO test_blocks VALUES ('two', '{134.53.24.0/24}');

正如你所看到的,当我请求id为' one‘的那一行时,我可以得到整行。

代码语言:javascript
复制
SELECT blocks.block FROM test_blocks AS blocks WHERE blocks.id = 'one';
 id  |             block              
-----+--------------------------------
 one | {134.53.25.0/24,134.53.0.0/16}
(1 row)

在这里,我做了同样的查询,但只请求块。

代码语言:javascript
复制
SELECT blocks.block FROM test_blocks AS blocks WHERE blocks.id = 'one';
             block              
--------------------------------
 {134.53.25.0/24,134.53.0.0/16}
(1 row)

这里我要的是ip表。

代码语言:javascript
复制
SELECT TI.id, TI.ip FROM test_ips AS TI;
  id  |      ip      
------+--------------
 yeah | 134.53.100.2
 nope | 135.53.100.2
(2 rows)

在这里,我询问它的IP包含在所提供的任何inet块中的行(它们是与前面询问的相同的块数组),它工作得很好。

代码语言:javascript
复制
SELECT TI.id, TI.ip FROM test_ips AS TI WHERE TI.ip << ANY ('{134.53.25.0/24,134.53.0.0/16}');
  id  |      ip      
------+--------------
 yeah | 134.53.100.2
(1 row)

问题是,当我试图询问同一个块中的相同IP时,但是将该块作为子查询,我最终得到了一个错误。

代码语言:javascript
复制
SELECT TI.id, TI.ip FROM test_ips AS TI WHERE TI.ip << ANY (SELECT blocks.block FROM test_blocks AS blocks WHERE blocks.id = 'one');
ERROR:  el operador no existe: inet << inet[]

Translated: ERROR: operator does not exist: inet << inet[]

关于为什么会发生这种情况,或者我该如何解决,有什么建议吗?

按照Abelisto的建议,我尝试了一种新的咨询方式:

代码语言:javascript
复制
SELECT TI.id, TI.ip FROM test_ips AS TI WHERE TI.ip << ANY (ARRAY(SELECT blocks.block FROM test_blocks AS blocks WHERE blocks.id = 'one'));
ERROR:  no se pudo encontrar un tipo de array para el tipo de dato inet[]

TRANSLATED: ERROR: Couldn't find a type of array for data type inet[]

正如Abelisto再次建议的那样,我首先取消嵌套我的块。这一次它起作用了。

代码语言:javascript
复制
SELECT TI.id, TI.ip FROM test_ips AS TI WHERE TI.ip << ANY (SELECT unnest(blocks.block) FROM test_blocks AS blocks WHERE blocks.id = 'one');
  id  |      ip      
------+--------------
 yeah | 134.53.100.2
(1 row)
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38086180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档