在 Postgres 中收集递归 JSON 键

2024-02-29

我有 JSON 文档以 JSON 数据类型 (Postgres 9.3) 存储在 Postgres 中,并且我需要递归地收集树中的键名称。

例如,给定这个 JSON 树

{
 "files": {
  "folder": {
   "file1": {
    "property": "blah"
   },
   "file2": {
    "property": "blah"
   },
   "file3": {
    "property": "blah"
   },
   "file4": {
    "property": "blah"
   }
 }
},
"software": {
  "apt": {
    "package1": {
        "version": 1.2
    },
    "package2": {
        "version": 1.2
    },
    "package3": {
        "version": 1.2
    },
    "package4": {
        "version": 1.2
    }
  }
 }
}

我想提取类似 [file1,file2,file3,file3,package1,package2,package3,package4] 的内容

基本上只是我可以用于文本搜索索引的键列表。

我知道我可以使用类似的方法获得最外面对象上的键列表

SELECT DISTINCT(json_object_keys(data))

我知道可以使用类似的东西递归地爬过树

WITH RECURSIVE data()

但我很难将两者放在一起。

有人可以帮忙吗?


诀窍是使用添加一些最终条件测试json_typeof在正确的地方。

您还应该使用jsonb如果您不关心对象键顺序。

这是我的工作环境:

CREATE TABLE test (
  id  SERIAL PRIMARY KEY,
  doc JSON
);

INSERT INTO test (doc) VALUES ('{
 "files": {
  "folder": {
   "file1": {
    "property": "blah"
   },
   "file2": {
    "property": "blah"
   },
   "file3": {
    "property": "blah"
   },
   "file4": {
    "property": "blah",
    "prop" : {
      "clap": "clap"
    }
   }
 }
},
"software": {
  "apt": {
    "package1": {
        "version": 1.2
    },
    "package2": {
        "version": 1.2
    },
    "package3": {
        "version": 1.2
    },
    "package4": {
        "version": 1.2
    }
  }
 }
}');

当第二个查询未返回任何行时,递归将停止。这是通过将空对象传递给json_each.

 WITH RECURSIVE doc_key_and_value_recursive(key, value) AS (
  SELECT
    t.key,
    t.value
  FROM test, json_each(test.doc) AS t

  UNION ALL

  SELECT
    t.key,
    t.value
  FROM doc_key_and_value_recursive,
    json_each(CASE 
      WHEN json_typeof(doc_key_and_value_recursive.value) <> 'object' THEN '{}' :: JSON
      ELSE doc_key_and_value_recursive.value
    END) AS t
)
SELECT *
FROM doc_key_and_value_recursive
WHERE json_typeof(doc_key_and_value_recursive.value) <> 'object';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Postgres 中收集递归 JSON 键 的相关文章

  • 使用本地 JSON 数据填充 jQuery Mobile ListView

    我正在尝试使用本地 JSON 信息填充 JQM ListView 但是 不会创建任何列表项 任何帮助 将不胜感激 这是我的代码 JSON 文件结构 name test calories 1000 fat 100 protein 100 ca
  • SQL where 连接集必须包含所有值,但可以包含更多值

    我有三张桌子offers sports和连接表offers sports class Offer lt ActiveRecord Base has and belongs to many sports end class Sport lt
  • php 删除特定文件夹及其所有内容

    我正在使用 php 删除包含已删除帖子图像的文件夹 我正在使用下面的代码 这是我在网上找到的并且做得很好 我想知道当一个文件夹中有其他文件夹时 如何只删除其中的特定文件夹 当我使用下面的代码时 如何才能做到这一点 使用 dev images
  • 如何在 PostgreSQL 中克隆记录

    我想循环查询 但也保留下一个循环的实际记录 这样我就可以比较两个相邻的行 CREATE OR REPLACE FUNCTION public test RETURNS void AS body DECLARE previous RECORD
  • PSQL [错误] - 值被识别为列

    前几天刚开始学习数据库 我遇到了这个问题 我的值被识别为一列 并且它吐出了一个错误 这是我的News table id bodyText url createdAt updatedAt 这是我在 psql 中运行的命令 INSERT INT
  • 使用 Node.JS,如何将 JSON 文件读入(服务器)内存?

    背景 我正在使用 Node js 进行一些实验 并且希望从文本文件或 js 文件 哪个更好 读取 JSON 对象到内存中 以便我可以从代码快速访问该对象 我意识到有像 Mongo Alfred 等这样的东西 但这不是我现在需要的 Quest
  • 递归方法比交互式方法慢 10 倍 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 代码已尽可
  • 如何向我的 Spring MVC REST 服务添加错误?

    如果用户没有输入我正在编码的两个名称 我如何更改 更新来自 Spring MVC 的以下 REST 调用以返回错误 未找到 RequestMapping value name method RequestMethod GET Respons
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • postgresql-按每个元素中的单词对数组进行排序

    有字符串数组 ARRAY CAT CAT DOG CAT DOG Cat 现在我想根据每个元素中的单词数对该数组进行排序 我已经尝试过 但没有取得任何成功 我想要这个输出 ARRAY CAT DOG CAT DOG CAT Cat 我怎样才
  • 按每月时间为用户标记标签

    数据源 User ID Visit Date 1 2020 01 01 12 29 15 1 2020 01 02 12 30 11 1 2020 04 01 12 31 01 2 2020 05 01 12 31 14 Problem 我
  • Slick和bonecp:org.postgresql.util.PSQLException:FATAL:抱歉,太多客户端已经错误

    当我在本地开发应用程序时 我使用以下命令启动我的 play2 应用程序sbt run 我喜欢如何更改代码 然后重新加载浏览器以查看我的更改 在大约 10 次代码更改之后 我收到 postgresql 太多连接错误 见下文 我的数据库连接使用
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • 检查 JSON 模式中不同的嵌套属性

    有没有办法在嵌套 JSON 模式中实现相当于 CHECK 约束的 Postgres 假设我们有具有两个属性的数据 每个属性都有嵌套属性 JSON Schema 如何使第一个对象所需的内容依赖于第二个对象 我的真实案例场景是为 GeoJSON
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 有人知道如何将 GMap Static JSON 转换为 HTML url?

    我已经从以下位置下载了示例样式的地图snazzymaps com http snazzymaps com 我尝试转换为类似的网址但我做得不好 我正在尝试改变下一个例子 Google 地图样式静态示例 http snazzymaps com
  • 在堆栈已满并给出分段错误之前,C/C++ 中的最大递归函数调用次数?

    我正在做一个问题 我使用递归函数来创建线段树 对于较大的值 它开始出现分段错误 所以我之前认为可能是因为数组索引值越界 但后来我认为这可能是因为程序堆栈太大 我编写这段代码是为了计算系统出现段错误之前允许的最大递归调用次数 include
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基

随机推荐

  • CallKit 查找用于从本机电话应用程序启动应用程序的号码

    我已经在我们的应用程序中实现了 CallKit 我们的应用程序拨打的电话显示在本机电话应用程序的最近通话列表中 当点击最近列表中我们的应用程序的条目时 我们的应用程序就会启动 有没有办法找出哪个数字 条目 用于启动我们的应用程序 openU
  • 在何处添加事件侦听器的最佳实践

    在我的页面上 用户单击一个元素以对其进行编辑 为了促进这一点 我分配了班级editable所有这些元素 我应该如何监听所有这些元素的点击 目前 我正在这样做 document body addEventListener click even
  • 如何从Google代码库调试源代码

    我想从谷歌代码存储库调试以下源代码 http code google com p rx 我的问题是 我无法找到一个合适的IDE 可以将源代码中的所有子文件夹视为一个完整的项目 我尝试过 netbeans C codeblocks eclip
  • VBA数据层错误处理

    我有一些遗留的 Excel 文件 其中包含大量对存储过程和数据库连接的调用 所有这些都以旧方式使用记录集完成 因为在 VBA 中没有像 NET 中那样的 try catch finally 概念 是否有任何最佳实践可以应用以获得更可靠的数据
  • 在日期字段上使用 max 的 JPQL 查询

    我需要查询以从一组记录中查找具有最新日期的记录 我尝试过很多东西 最近的一个是这样的 select msg msg createdDate from ImportedMessage msg where msg siteId 1 and ms
  • 不破坏html C#的子字符串

    大家好 我正在尝试获取已在所见即所得编辑器中输入的描述并获取它的子字符串 i e This is some span style font weight bold text span 如果我只是子串并添加 我想在不破坏html的情况下限制一
  • 将发布 dll 与调试主应用程序 exe 混合

    假设我有一个 Visual C 应用程序 它有一个主可执行文件和许多 dll 我有2个配置发布和调试 我只是想知道使用 mix 可能会产生什么效果 我的意思是使用带有发布主 exe 的调试 dll 或带有发布 dll 的调试 exe Tha
  • Angular - 单击菜单项后隐藏侧边栏菜单

    我创建了一个侧边栏菜单 但单击菜单项后无法隐藏该菜单 我按照以下示例https blog thecodecampus de angular 2 animate creating sliding side navigation https b
  • 如何在 Objective C 中对 NSMutableArray 进行排序 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发计时器应用程序 我有一个数
  • 正则表达式用 HTML 标签包裹字符串

    我有一个文本区域 其中有很多行 如下所示 1 stuff 2 more stuff 123 even more stuff 我正在使用正则表达式来查找 num 模式 0 9 我想让它们成为锚标记 例如 a href 123 123 a 但它
  • 如何在数据库中插入时间戳? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我收到此错误 java lang IllegalArgumentException 时间戳格式必须为 yyyy mm dd 时 分
  • 两个 pandas 数据帧之间的欧几里德距离

    我有两个数据框 df1形式的 user id x coord y coord 214 55 2 22 1 214 55 2 22 1 214 55 2 22 1 and df2 形式相同 但用户不同 user id x coord y co
  • 无法安装mbstring php冲突

    我正在尝试使用 php 5 6 安装 php mbstring 并收到此错误 Error php56w common conflicts with php common 5 4 45 3 el6 remi x86 64 You could
  • 当 JavaFX 中选定的选项卡更改时如何聚焦特定节点?

    我想将焦点设置到选项卡内容中的特定节点 我添加了一个变化监听器 to 选定的项目属性如下 假设该类包含一个名为第二个节点类型的Node tabPane getSelectionModel selectedItemProperty addLi
  • html5数据属性不区分大小写吗?

    我最近注意到chrome转换数据属性data 为小写 e g div div 将被转换为 div div 在 Chrome 开发工具中 当我用 javascript 调用该属性时 console log e hasAttribute dat
  • Jekyll 如何处理 _posts/subdir 中的帖子

    Jekyll Bootstrap 项目在目录中有一篇示例博客文章 posts core samples 我假设 子目录中的帖子 文件 的处理方式与根目录中的帖子相同 它是否正确 如果是这样 我将添加一个 stage 子目录 将其排除 这样我
  • 为什么不使用记录的创建时间作为主键?

    我有一个表 其中有一个自动递增的 PK 和creation date 字段 这是unix 时间戳 我想知道为什么不丢失自动递增字段并使用创建日期字段作为 PK 因为它是唯一的 我使用 1 1000 秒的精度 对于 我正在删除一个索引行 反对
  • ffmpeg - 我可以将音频通道绘制为图像吗?

    我想知道是否可以使用 ffmpeg 将视频或音频文件的音频通道绘制为图像 或者是否有其他工具可以在 Win2k8 x64 上执行此操作 我将这样做作为用户上传视频或音频文件后编码过程的一部分 我使用 ColdFusion 10 来处理上传并
  • 安装 phpredis MAC OSX

    任何人都可以帮我在 MAC OSX 中安装 php redis 吗 brew install php redis 不工作 pecl install php redis 也不起作用 无效的包名称 包文件 php redis 自制错误 自制错误
  • 在 Postgres 中收集递归 JSON 键

    我有 JSON 文档以 JSON 数据类型 Postgres 9 3 存储在 Postgres 中 并且我需要递归地收集树中的键名称 例如 给定这个 JSON 树 files folder file1 property blah file2