在Postgres JSON数组中查询

邵逸夫

您将如何在存储在json列中的数组内搜索元素(更新:另请参见9.4更新的答案jsonb列)。

如果我有这样的JSON文档,则存储在json名为列中blob

{"name": "Wolf",
 "ids": [185603363281305602,185603363289694211]}

我想要做的是这样的:

SELECT * from "mytable" WHERE 185603363289694211 = ANY("blob"->'ids');

并取出所有匹配的行。但这不起作用,因为它"blob"->'ids'返回JSON值,而不是Postgres数组。

如果可能,我还想在各个ID上建立索引。

邵逸夫

以下原始答案仅适用于Postgres 9.3。有关Postgres 9.4的答案,请参见下面的更新。

这建立在Erwin的参考答案的基础上,但对该问题更为明确。

在这种情况下bigint这些ID是s,因此请创建一个用于将JSON数组转换为Postgresbigint数组的辅助函数

CREATE OR REPLACE FUNCTION json_array_bigint(_j json)
  RETURNS bigint[] AS
$$
SELECT array_agg(elem::text::bigint)
FROM json_array_elements(_j) AS elem
$$
  LANGUAGE sql IMMUTABLE;

我们可以轻松地(也许更可重用)text在这里返回一个数组。我怀疑建立索引的bigint速度比text以前快很多,但是我很难在网上找到证据来证明这一点。

用于建立索引:

CREATE INDEX "myindex" ON "mytable" 
  USING GIN (json_array_bigint("blob"->'ids'));

对于查询,这有效并使用索引:

SELECT * FROM "mytable" 
  WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');

这样做也可以用于查询,但是它不使用索引:

SELECT * FROM "mytable" 
  WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));

9.4更新

Postgres 9.4引入了这种jsonb类型。这是一个很好的SO答案,有关jsonb何时使用它的建议json简而言之,如果您要查询JSON,则应使用jsonb

如果将列构建为jsonb,则可以使用以下查询:

SELECT * FROM "mytable"
  WHERE blob @> '{"ids": [185603363289694211]}';

@>是Postgres的包含操作,记录了jsonb这里感谢Alain的回答,这引起了我的注意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Rails中查询Postgres JSON数组字段

来自分类Dev

在postgres中查询json

来自分类Dev

在Postgres中查询jsonb数组

来自分类Dev

使用 Postgres 中的嵌套数组高效查询 JSON

来自分类Dev

列表中的Postgres JSON查询

来自分类Dev

Postgres中的嵌套JSON查询

来自分类Dev

包含某些内容的Postgres查询JSON数组

来自分类Dev

Ecto 查询 Postgres JSON 数组的值

来自分类Dev

在postgres中按数组值查询列

来自分类Dev

在postgres json字段中查询json键

来自分类Dev

在postgres json字段中查询json键

来自分类Dev

Postgres数组查询

来自分类Dev

Rails OR查询与Postgres数组

来自分类Dev

Postgres 中 JSON 查询中的 OR 子句

来自分类Dev

从postgres中的json结构查询数组中的最后一个元素

来自分类Dev

如何在postgres db中的包含JSON数组的列内查询

来自分类Dev

在postgres中查询嵌套的Json对象

来自分类Dev

查询在 postgres jsonb 中相交的 json 键

来自分类Dev

Jooq Postgres JSON查询

来自分类Dev

节点Postgres查询json

来自分类Dev

Postgres查询json数据

来自分类Dev

Postgres 中的数组数组

来自分类Dev

从Postgres中的JSON数组中选择

来自分类Dev

在Postgres DB中索引JSON数组

来自分类Dev

如何在 Postgres 中过滤 JSON 数组

来自分类Dev

Postgres查询JSON数组以查找符合条件的计数

来自分类Dev

Postgres中的格式查询

来自分类Dev

在 Postgres 中查询 JSONB 中的复杂数组

来自分类Dev

比较Postgres中的数组