2017-05-09 106 views
0

我很难查询jsonb数据。我不习惯在postgres中处理jsonb类型。是否有可能在jsonb字段上执行哪里在PostgreSQL - 在JSONB中的位置

我有这样

id | act | act_id |  from_ids  |  object_ids  | post_date 
2 post  1  {"2":"1494308197"} {"items":["104564"]} 1494308197 

数据我试图做这样的事情下面找到在from_ids的列,其中ID是关键任何标识。

SELECT an.* FROM activity_network an, jsonb_each(an.from_ids) d WHERE d.key->> in ('2'); 

但显然这是行不通的。我尝试了各种形式。

我找到一个类似的question,但它不适合我需要的,因为它得到的值,我需要key使用IN

不知道如何使用这些jsonb函数。

回答

1

它比简单得多:

SELECT an.* 
FROM activity_network an 
WHERE an.from_ids ?| ARRAY['2']; 

the documentation

下指数能够加快这样一个查询:

CREATE INDEX ON activity_network USING gin (from_ids); 
+0

那么看看那个。这很简单。几个小时一直在敲我的头。感谢您的快速!如果数组中有多个项目,似乎没有使用杜松子酒索引。你会碰巧知道这是否可以索引? –

+0

我已经扩展了包含该信息的答案。如果你没有看到使用的索引,也许PostgreSQL认为顺序扫描更便宜。您可以'SET enable_seqscan = off'来测试是否可以使用索引*。 –

0

可以使用jsonb_exists函数,该函数。

SELECT an.* FROM activity_network an WHERE jsonb_exists(an.from_ids,'2'); 

the PG documentation映射到该函数描述的?运算符。如果您使用PHP,Java或C + libpq以外的任何其他语言,我建议您使用它,因为世界上每个人都同意?代表位置参数,但Postgres团队除外。

+0

所以我实际上没有在文档中看到这个函数。你在哪里找到它? –

+0

您可以在psql控制台中运行'\ doS +'来找到它。当你有+时,它只会列出相应的功能。这是几页下来。 – coladict