【问题标题】:Get value of first key in nested json object using SQL使用 SQL 获取嵌套 json 对象中第一个键的值
【发布时间】:2015-08-25 23:57:55
【问题描述】:

Json 格式为

{
  "query": {
    "pages": {
      "294195": {
        "id": 294195,
        "title": "title 123",
        "detail": "detail content..."
      }
    }
  }
}

我想阅读294195,以及此元素下的详细信息。

但实际上元素名称“294195”是动态的。

我不能使用294195 作为元素名称:

"Json"->'query'->'pages'->'294195'

有没有类似的

"Json"->'query'->'pages'->Firt_Element_Name->'id'

注意:"Json" 是列名,类型为 Json。

【问题讨论】:

  • 您可能必须在横向查询中使用json_eachrow_number 解压缩json 对象,然后选择第一行。尴尬的。或者在子查询中使用json_object_keys 来获取第一个键。你真正想要的是一个合适的 json 查询表达式系统,比如 json 的 xpath。一些人正在为 PostgreSQL 开发一个,但它还没有被包括在内。
  • 另外,请注意真正的 json 对象没有逻辑顺序。您不能依赖“第一”的关键。你真的想要第一个出现在对象中的那个吗?还是数值最低的那个?

标签: sql json postgresql


【解决方案1】:
Json.query.pages[0].title
Json.query.pages[0].details

无论第一个生成的编号是什么,都为“title”提供第一个密钥对值,为“details”提供第一个密钥对值。无论您动态获得的#如何,这都有效。将其弹出到一个函数中,您可以将它们设置为 var 并将它们连接成一个字符串,或者将它们推送到一个数组/对象中。

【讨论】:

  • 这个(点法)可以在 Postgresql 中使用吗?它无法识别。您的方法更像.net
  • 嗯,我只是标记点符号以获取您的元素,而不是写出特定的复制和粘贴代码,因为 Barbara Laird 将点符号编辑为“code sn-p”。抱歉,她重新格式化了我的回复,让您相信这是实际代码。我需要知道您使用什么语言来访问您的 Postgresql 数据库,以便为您提供有效的复制+粘贴代码。
  • 在原始帖子中,它是 PostgreSQL 自身的代码,使用运算符进行 SQL 查询以访问 json 结构。我建议删除此答案,因为它对用户没有帮助,并且会阻止其他人回复。
【解决方案2】:

这有点尴尬 b/c 我必须先创建您的原始 json 对象,然后才能对其进行查询,但这里有一个 PostgreSQL 剪切和粘贴解决方案,它将提取 294195 下的数据:

with origjson as (select '{"query": {"pages": {"294195": {"id": 294195,"title": "title 123","detail": "detail content..."}}}}'::jsonb as pagedata)
,firstid as (select jsonb_object_keys(pagedata #> '{query, pages}') as id from origjson)
select pagedata #> ('{query, pages, ' || (select id from firstid limit 1) || '}')::text[] from origjson;

结果:

{"id": 294195, "title": "title 123", "detail": "detail content..."}

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2021-08-16
    • 2022-08-18
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多