如何使用新 PostgreSQL JSON 数据类型中的字段进行查询?

2024-02-01

我正在寻找 PostgreSQL 9.2 中新 JSON 函数的一些文档和/或示例。

具体来说,给定一系列 JSON 记录:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

我该如何编写 SQL 来按名称查找记录?

在普通 SQL 中:

SELECT * from json_data WHERE "name" = "Toby"

官方的开发手册非常稀疏:

  • http://www.postgresql.org/docs/devel/static/datatype-json.html http://www.postgresql.org/docs/devel/static/datatype-json.html
  • http://www.postgresql.org/docs/devel/static/functions-json.html http://www.postgresql.org/docs/devel/static/functions-json.html

Update I

我整理了一个gist 详细介绍了 PostgreSQL 9.2 当前的功能 https://gist.github.com/2715918。 使用一些自定义函数,可以执行以下操作:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';

更新二

我现在已将 JSON 函数移至他们自己的项目中:

PostSQL https://github.com/tobyhede/postsql- 一组用于将 PostgreSQL 和 PL/v8 转换为非常棒的 JSON 文档存储的函数


Postgres 9.2

I quote Andrew Dunstan 在 pgsql-hackers 名单上 https://archives.postgresql.org/pgsql-hackers/2012-01/msg01764.php:

在某个阶段可能会有一些 json 处理(而不是 到 json 生成)函数,但在 9.2 中没有。

并不妨碍他提供 PLV8 中的示例实现来解决您的问题。 (链接现已失效,请参阅现代PLV8 https://plv8.github.io/反而。)

Postgres 9.3

提供一系列新函数和运算符来添加“json-processing”。

  • 新 JSON 功能的手册。 https://www.postgresql.org/docs/9.3/functions-json.html
  • Postgres Wiki 关于 pg 9.3 中的新功能 https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.3#JSON:_Additional_functionality.

答案是原问题在 Postgres 9.3 中:

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

高级示例:

  • 具有 JSON 数据类型中的嵌套记录数组的查询组合 https://stackoverflow.com/questions/26877241/query-combinations-with-nested-array-of-records-in-json-datatype/26880705#26880705

对于更大的表,您可能需要添加表达式索引以提高性能:

  • 用于在 JSON 数组中查找元素的索引 https://stackoverflow.com/questions/18404055/index-for-finding-element-in-json-array

Postgres 9.4

Adds jsonb(b 表示“二进制”,值存储为本机 Postgres 类型)以及更多功能both类型。除了上面提到的表达式索引之外,jsonb也支持GIN、btree 和哈希索引 https://www.postgresql.org/docs/9.4/datatype-json.html#JSON-INDEXING,GIN 是其中最有效的。

  • 手册上json and jsonb数据类型 https://www.postgresql.org/docs/9.4/datatype-json.html and 功能 https://www.postgresql.org/docs/current/functions-json.html.
  • Postgres Wiki 关于 JSONB 的第 9.4 页 https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#JSONB_Binary_JSON_storage

该手册甚至建议:

一般来说,大多数应用程序应该更喜欢将 JSON 数据存储为jsonb,除非有非常特殊的需求,例如遗留 关于对象键排序的假设。

大胆强调我的。

性能受益于 GIN 索引的全面改进。 https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.4#GIN_indexes_now_faster_and_smaller

Postgres 9.5

完全的jsonb函数和运算符。添加更多操作功能jsonb就位并进行展示。

  • Postgres 9.5 发行说明中的​​重大好消息。 https://www.postgresql.org/docs/9.5/release-9-5.html#AEN126466
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用新 PostgreSQL JSON 数据类型中的字段进行查询? 的相关文章

随机推荐

  • 混合语言框架

    我有一个用 Objective C 编写的框架 我们称之为 MyKit 我用一些 Swift 类对其进行了扩展 我正在尝试使用以下文档来理解它 https developer apple com library ios documentat
  • OpenGL ES 片段着色器可以更改片段的深度值吗?

    OpenGL ES 2 0 中的片段着色器可以更改像素的 Z 值 深度 吗 在 OpenGL ES 2 0 中这是如何实现的 No gl FragDepth 这是 GLSL 桌面版本的一部分 在 OpenGL ES 中不存在 但是 您可以检
  • NHibernate 将类属性映射到行而不是列

    是否可以映射一个类 其中每个属性存储为表中的行而不是列 该场景是我们将全局选项保存到数据库的情况 我们将选项存储在 选项 类中 每个选项都有一个属性 即 展开菜单 退出时保存 等 我们不想将每个选项存储在其自己的表列中 而是希望有一个表 其
  • 如何获取包含占位符的属性的原始值?

    我试图在我的 properties 文件之一中定义以下属性 personExpression person surname 然后由配置类读取 Configuration public class TemplateConfig Autowir
  • 在 Chrome 扩展程序中获取 JSON

    我的 chrome 扩展有一个小问题 我只是想从另一台服务器获取 JSON 数组 但清单 2 不允许我这样做 我尝试指定content security policy 但 JSON 数组存储在没有 SSL 证书的服务器上 那么 如果不使用清
  • 更改 varchar 列的最大长度?

    我正在尝试将 varchar 列的长度从 255 个字符更新为 500 个字符 而不会丢失内容 我之前已经删除并重新创建过表 但我从未接触过 alter 语句 我相信我需要使用它来执行此操作 我在这里找到了文档 更改表 Transact S
  • Python——使用 Selenium 打开多个选项卡

    我正在使用Python 我正在尝试在 Chrome 上打开两个选项卡 每个选项卡都指向不同的网站 这是我的代码 from selenium import webdriver from selenium webdriver common ke
  • 将视频添加到 YouTube 上用户最喜欢/喜欢的播放列表

    目的是使用 YouTube API 创建一个收藏 喜欢按钮 当用户单击该按钮时 视频将保存到用户的 收藏 喜欢 播放列表中 就像您在自己的网站上实施 Facebook Like 按钮时的工作原理一样 这本质上是对发布的出色解决方案的后续问题
  • 在 google oauth 后,如何在不使用 webview 的情况下将用户重定向回我的应用程序?

    谷歌决定禁止通过 webview 进行 oauth 给我带来了巨大的麻烦 迁移到替代方案是一个漫长而困难的过程 我目前正在使用建议的 AppAuth 库 并且我收到用户抱怨 如果不将帐户添加到 chrome 他们的设备 这作为据我所知 如果
  • 地址簿联系人排序

    我有下面的代码 我设法从地址簿中列出了姓名和电话号码 但如何按名字对其进行排序 ABAddressBookRef addressBookRef ABAddressBookCreateWithOptions NULL NULL abConta
  • 多线程 Grep

    我有以下包含 30233088 字符串的 大 文件 head mystringfile txt GAATGAACACGAAGAA GAATGAACACGAAGAC GAATGAACACGAAGAG GAATGAACACGAAGCA cat
  • 为什么厨师无法解析我的食谱?

    Intro我正在学习 Chef 以自动化工作中的服务器管理 我从下载了 Chefdk 3 0here https downloads getchef com chef dk windows 现在我正在尝试使用厨师制作我的第一本食谱 重要的我
  • .npm 缓存与 node_modules 大小

    在构建节点应用程序时 我们使用 npm 缓存 如下所示 npm install cache tmp node cache npm prefer offline 但是我有理由相信 缓存无法正常工作 因为 tmp node cache du s
  • 在 AWS Elastic Beanstalk 上部署 Flask 与运行脚本有何不同?

    在 ec2 实例上部署 Flask 应用程序 换句话说 在任何计算机上运行脚本 和通过 AWS Elastic Beanstalk 部署 Flask 应用程序有什么区别 烧瓶部署文档 http flask pocoo org docs 0
  • 是不是更喜欢预增量而不是后增量?

    过去的情况是 预增量是首选 因为类上重载的后增量需要返回表示增量之前对象状态的临时副本 看来这不再是一个严重的问题 只要内联到位 因为我的旧 C 编译器 GCC 4 4 7 似乎将以下两个函数优化为相同的代码 class Int publi
  • 静态和默认构造函数

    非静态类可以同时具有静态构造函数和默认构造函数 这两个构造函数有什么区别 我什么时候应该只使用静态或使用默认构造函数的静态 静态构造函数在您第一次访问类的实例之前为每个 AppDomain 运行一次 您可以使用它来初始化静态变量 另一方面
  • MVC3 不显眼的验证扩展;条款和条件复选框

    我还看过其他一些关于此的帖子 MVC 对复选框的不显眼验证不起作用 https stackoverflow com questions 6923430 mvc unobtrusive validation on checkbox not w
  • jdbc 中的未知数据库

    我正在使用 JDBC 而且是新手 但我不断收到此运行时异常 connecting to psysical database com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException
  • 如果任何特定列集中的值满足特定条件,则返回整行

    我有一个数据框 我想保留任何价格列大于某个值的行 水果 这是一个可重现的示例 您可以将其直接复制并粘贴到 R 中 fruit c apple orange banana berry 1st col ID c 123 3453 4563 32
  • 如何使用新 PostgreSQL JSON 数据类型中的字段进行查询?

    我正在寻找 PostgreSQL 9 2 中新 JSON 函数的一些文档和 或示例 具体来说 给定一系列 JSON 记录 name Toby occupation Software Engineer name Zaphod occupati