从 postgres 中的复杂嵌套结构中检索具有特定键名称的 json 元素

2024-06-22

我在 postgres json 字段中有一个复杂的嵌套 json 结构。我想列出所有带有键“$type”的元素值,无论它们出现在嵌套结构中的哪个位置。该结构包含嵌套在多个深度的数组中的数组。我应该使用什么sql查询?

表结构为:

create table if not exists documents
(
  id text not null
    constraint documents_pkey primary key,
  value json not null
)

此递归函数从复杂的 jsonb 对象中提取所有属性:

create or replace function jsonb_extract_all(jsonb_data jsonb, curr_path text[] default '{}')
returns table(path text[], value text)
language plpgsql as $$
begin
    if jsonb_typeof(jsonb_data) = 'object' then
        return query 
            select (jsonb_extract_all(val, curr_path || key)).*
            from jsonb_each(jsonb_data) e(key, val);
    elseif jsonb_typeof(jsonb_data) = 'array' then
        return query 
            select (jsonb_extract_all(val, curr_path || ord::text)).*
            from jsonb_array_elements(jsonb_data) with ordinality e(val, ord);
    else
        return query
            select curr_path, jsonb_data::text;
    end if;
end $$;

用法示例:

with my_table(data) as (
select
    '{
        "$type": "a",
        "other": "x",
        "nested_object": {"$type": "b"},
        "array_1": [{"other": "y"}, {"$type": "c"}],
        "array_2": [{"$type": "d"}, {"other": "z"}]
    }'::jsonb
)

select f.*
from my_table
cross join jsonb_extract_all(data) f
where path[cardinality(path)] = '$type';

         path          | value 
-----------------------+-------
 {$type}               | "a"
 {array_1,2,$type}     | "c"
 {array_2,1,$type}     | "d"
 {nested_object,$type} | "b"
(4 rows)    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 postgres 中的复杂嵌套结构中检索具有特定键名称的 json 元素 的相关文章

随机推荐

  • PHP 表单提交删除了空白答案 - 如果字段为空白,则停止提交正文消息

    php 的简短版本 https i stack imgur com Djxsw jpg我有一个包含两部分的表格 申请人和共同申请人 我正在尝试获取它 以便如果共同申请人字段为空或不需要php文件不会在提交时发布所有空白字段 因为我最终只有两
  • 有没有办法在 MacOSX 上使用 Xcode 将 bash shell 脚本与 AppleScriptObjC 应用程序一起打包?

    我正在尝试使用 AppleScriptObjC 作为包装器来自动化三个或四个 bash shell 脚本 这将为我提供一个友好的 GUI 前端来选择数据文件等 以及方便的文本文件操作和多个 bash 脚本的处理 一切正常 我可以按下按钮并运
  • 使用project.json将内容文件包含在nuget包中

    我正在使用此 nuspec 文件生成 nuget 包
  • NSFileManager URL 与路径

    为什么 URL 方法是这样的moveItemAtURL toURL error of NSFileManager类比 Path 方法更推荐moveItemAtPath toPath error 创建 NSURL 对象时 还会检查路径是否有效
  • 捕获组内贪婪修饰符的奇怪行为

    考虑以下命令 text lt abcdEEEEfg sub c E text 1 ab EEEfg lt lt lt OKAY sub c E text 1 ab EEfg lt lt lt WEIRD sub c E text perl
  • FLOPS Intel 核心并使用 C 语言对其进行测试(内积)

    我对测量触发器有一些误解 在英特尔架构上 触发器是一次加法和一次乘法吗 我在网上的某个地方读到过这一点 没有任何辩论可以拒绝这一点 我知道FLOP在不同类型的cpu上有不同的含义 如何计算理论峰值 FLOPS 我使用的是 Intel R C
  • execve() 无法启动 C 程序

    我正在尝试使用生成一个新进程execve from unistd h在 Linux 上 我尝试向它传递以下参数execve bin ls bin ls NULL 但没有得到结果 我也没有收到错误 程序只是退出 发生这种情况有原因吗 我尝试以
  • 在数据表 Ajax 调用中通过 Ajax 更新 div

    我想进行一次 Ajax 调用 不仅更新数据表 还更新位于页面其他位置的 div 我正在使用 Ajax datatable rails gem 我构建了 ajax 调用的上半部分 例如 people datatable dataTable p
  • 调用函数时,函数名称和参数之间的“类型断言”是什么?

    In this Typescript React 入门指南 https github com Microsoft TypeScript React Starter creating a store它给 import createStore
  • 如何在 Visual Studio 2015 cordova 项目中更新 cordova-ios 版本?

    我正在 Visual Studio 2015 中使用 cordova 模板开发 ios 应用程序 我已经按照此链接中的描述配置了 mac book https taco visualstudio com en us docs ios gui
  • 这是使用嵌入式 SQL 相对于存储过程的有效优势吗?

    这是我没有听说过的 SP 论据 火焰喷射器 温柔对待羽绒虱 由于每次访问数据库服务器都会产生相关开销 因此我建议将 SQL 放在 SP 中而不是嵌入代码中的一个可能原因是 您可以更容易地进行更改 而不会影响性能 例如 假设您需要执行返回标量
  • Joda 时间,周期至总毫秒数

    我正在尝试获取total毫秒数 not周期对象实例中的毫秒字段 我尝试了多次转换 因为我找不到任何轻松提供它的方法 有没有人曾经需要过它并设法取回它 我的补丁需要这个 以计算出负周期 负毫秒 负周期 您无法直接从Period 因为像月份和年
  • 如何只运行30分钟的java函数

    我需要创建一个仅运行 30 分钟的 java 函数 并在 30 分钟结束时执行一些操作 但如果满足正确的条件 它也应该能够在给定时间之前自行终止 我不希望该函数处于休眠状态 因为它应该收集数据 因此没有休眠线程 Thanks Use Tim
  • Django 设置:引发 KeyError、引发 ImproperlyConfigured 或使用默认值?

    Django 希望您在以下位置使用环境变量settings py适应多种环境 例如本地 heroku AWS 我想我应该在环境变量中定义数据库的用户名DB USERNAME 我应该如何阅读它 import os DB USERNAME os
  • PHP imagettftext 基线解决方法

    我正在编写使用 PHP 将文本打印到图像的方法 然而 该函数imagettftext 使用基线 而我需要文本垂直居中 因此 我要么需要一种方法来打印文本 其中 y 不是从顶部到基线的距离 而是从边界框的顶部到顶部的距离 或者我需要一种可以确
  • 奇怪的 View.getHitRect() 行为

    我有一个简单的布局
  • MEAN 堆栈文件上传

    我最近开始使用 MEAN Stack 进行编程 目前正在实现某种社交网络 一直使用 MEAN io 框架来做到这一点 我现在的主要问题是让文件上传正常工作 因为我想做的是将文件从表单接收到 AngularJS 控制器中 并将其与更多信息一起
  • 使用 CSS 将单选按钮标签放置在上方

    我需要能够将单选按钮的标签放置在选项上方 而不是放置在左侧或右侧 有没有办法使用 CSS 来实现这种效果 THanks 我想我知道你在寻找什么 但如果我没有抓住重点 请纠正我 我假设您希望单选按钮位于其标签下方的中心 如果您同意添加 这会容
  • 如何在 svelte 3 中强制渲染?

    我有一个带有输入字段的表单 当我键入 keyup 时 必须清除这些字段之一Enter钥匙 我知道我可以将此字段作为受控字段来处理 意味着监听keyup并维护字段的副本 或者使用双向绑定 但在我的用例中 我不能执行后者 而且我宁愿不执行前者
  • 从 postgres 中的复杂嵌套结构中检索具有特定键名称的 json 元素

    我在 postgres json 字段中有一个复杂的嵌套 json 结构 我想列出所有带有键 type 的元素值 无论它们出现在嵌套结构中的哪个位置 该结构包含嵌套在多个深度的数组中的数组 我应该使用什么sql查询 表结构为 create