当前位置: 首页 > 面试题库 >

如何过滤json列中嵌套值上的行?

通骁
2023-03-14
问题内容

这是我的表(简体,仅重要的列):

CREATE TABLE things (
  id serial primary key
, name varchar
, blueprint json default '{}'
);

以及一些样本数据:

# select * from things;

 id |  name   |                                  blueprint
----+---------+-----------------------------------------------------------------------------
  1 | Thing 1 | {}
  2 | Thing 2 | {"1":{"name":"Iskapola","wight":"2"}}
  3 | Thing 3 | {"1":{"name":"Azamund","weight":"3"}, "2":{"name":"Iskapola","weight":"1"}}
  4 | Thing 4 | {"1":{"name":"Ulamir","weight":"1"}, "2":{"name":"Azamund","weight":"1"}}

我想选择键'Azamund'下任意位置的行name。像这样的东西:

# select * from things where * ->> 'name' = 'Azamund';

 id |      blueprint
----+----------------------------------------------------------------------------
  7 | {"1":{"name":"Azamund","weight":"3"}, "2":{"name":"Iskapola","weight":"1"}}
  8 | {"1":{"name":"Ulamir","weight":"1"}, "2":{"name":"Azamund","weight":"1"}}

数据完全像样本中一样嵌套(仅一层)。
当前,我们正在使用PostgreSQL 9.3.5。

在PostgreSQL 9.3中可以吗?也许是9.4?


问题答案:

您的查询已关闭。
json_each()

是关键功能。还是jsonb_each()为了jsonb。进行了一些改进:

SELECT *
FROM   things t
WHERE  EXISTS (
   SELECT FROM json_each(t.blueprint) b
   WHERE  b.value->>'name' ILIKE 'azamund'
   );

旧的sqlfiddle
db <>
fiddle在这里

  • json_each()已经返回该值作为json数据类型。无需额外的演员表。

  • 更好的是,在中使用LATERAL引用EXISTS。这比在SELECT列表中取消使用设置返回功能要干净得多。

在Postgres 12中使用SQL / JSON可以变得更简单/更高效…



 类似资料:
  • 我试图根据嵌套的JSON数组中的值过滤我的GET response(JSON)。例如:在下面的JSON中,我想过滤一个JSON数组,并用巧克力作为面糊打印出蛋糕的名称。 我尝试过这样的事情: 和 两者都返回空列表。

  • 在测试类下面,我想过滤所有部分中的公共语言列表。 例如,测试有药剂列表P1和P2。P1有一个列表 最终输出应该是包含Ja和Zh语言的语言对象列表。

  • 问题内容: 在Django Rest Framework中,当一个序列化器嵌套在另一个序列化器中时,如何过滤它? 我的过滤器被强加在DRF视图集中,但是当您从另一个序列化器内部调用序列化器时,嵌套序列化器的视图集将永远不会被调用,因此嵌套结果看起来是未经过滤的。 我尝试在原始视图集上添加过滤器,但是它似乎无法过滤嵌套结果,因为嵌套结果被称为单独的预提取查询。(您看到嵌套的序列化程序是反向查找。)

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要

  • 我有一个类似这样的组对象 和如下所示的Item对象

  • 我有一个映射: 我使用三个条件进行筛选: “日志类型”是“爬虫” “2020-05-23”上的“创建数据” “resp”的大小=0 我试图过滤与查询: {"查询":{"bool":{"必须":[{"术语":{"_logType":{"value":"爬虫"}}},{"范围":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zon