当前位置: 首页 > 知识库问答 >
问题:

在Postgres JSON数组内查询

叶卓君
2023-03-14

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

如果我有这样一个JSON文档,存储在名为blob的列中:

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

我想做的是:

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

并取出所有匹配的行。但这不起作用,因为"blob"-

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


共有3个答案

吴均
2023-03-14

我知道已经有一段时间了...

在postgresql-9.5中,现在可以轻松地查询它。

select '{"name": "Wolf",
         "ids": [185603363281305602,185603363289694211]}'::jsonb
       @> '{"ids":[185603363281305602]}'

我认为您应该使用jsonb字段,然后可以对其进行索引。

CREATE INDEX idx_gin_ids ON mytable USING gin ((blob -> 'ids'));
司空宣
2023-03-14

首先,尝试操作员-

接下来,查询可以这样工作:
如何使用新PostgreSQL JSON数据类型内的字段进行查询?

索引可能是这样工作的:
索引用于在JSON数组中查找元素

袁安志
2023-03-14

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

这建立在欧文的参考答案之上,但对这个问题更明确一点。

本例中的ID是bigint,因此创建一个helper函数,用于将JSON数组转换为Postgres-bigint数组:

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;

我们本可以在这里轻松地(也许更易于重用)返回一个数组。我怀疑在bigint上建立索引要比文本快得多,但我很难在网上找到支持这一点的证据。

用于构建索引:

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类型。这是一个很好的关于jsonb的答案,以及何时应该在json上使用它。简而言之,如果要查询JSON,应该使用jsonb。

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

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

<代码>@

 类似资料:
  • 本文向大家介绍PowerShell查找数组内容、搜索数组、查询数组的方法,包括了PowerShell查找数组内容、搜索数组、查询数组的方法的使用技巧和注意事项,需要的朋友参考一下 PowerShell中有-contain、-like、-in等操作符,使用这些操作符,可以很方便的在数组中查找元素内容。其中in操作符貌似要在PowerShell 3.0中才有。 先看一个例子,将Windows目录的所有

  • 问题内容: AngularJs中的内联方法是否可以检查某物是否为数组? 我本以为这样可以工作: 我已经证实它实际上是一个数组。有什么我想念的东西吗? 问题答案: 您可以戴上瞄准镜… 小提琴

  • 问题内容: 我正在尝试测试PostgreSQL 9.3中的类型。 我在名为的表中有一个列。JSON看起来像这样: 我想查询表中所有与“对象”数组中“ src”值匹配的报告。例如,是否可以在数据库中查询所有匹配的报告?我成功地写了一个查询,可以匹配: 但是由于具有一组值,所以我似乎无法编写出有效的东西。是否可以在数据库中查询所有匹配的报告?我已经查看了这些来源,但仍然无法了解: http://www

  • 我试图测试PostgreSQL 9.3中的类型。 我在一个名为的表中有一个名为的列。JSON如下所示: 我想查询表中与'objects'数组中的'src'值匹配的所有报告。例如,是否可以查询数据库中匹配的所有报告?我成功地编写了一个可以匹配的查询: null 我不是SQL专家,所以我不知道我做错了什么。

  • 我有一个表说类型,它有一个JSON列,说位置看起来像这样: 表中的每一行都有数据,并且都有“type”:“state”。我只想从表中的每一行提取“type”:“state”的值,并将其放入一个新列中。我问了几个问题,比如: 查询JSON列中的数组元素 用于在JSON数组中查找元素的索引 查询JSON类型内的数组元素 但无法让它工作。我不需要查询这个。我需要这个专栏的价值。如果我错过了什么,我事先道

  • 问题内容: 如何在PHP中合并n个数组 我的意思是我怎么可以这样做的工作: OR 里面有多个数组的数组在哪里,像这样: 我的结果是: 我需要的是 问题答案: array_merge可以接受可变数量的参数,因此,使用一些call_user_func_array技巧,您可以将数组传递给它: 基本上可以像输入以下内容一样运行: 更新: 现在有了5.6,我们有了运算符来将数组解压缩为参数,因此您可以: 并