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

12 浏览
0 Comments

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

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

具体而言,给定一系列JSON记录:

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

我要如何编写SQL以通过名称查找记录?

在原生SQL中:

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

官方开发手册相当简洁:

更新I

我已经编写了一个gist描述了PostgreSQL 9.2目前的可能性

使用一些自定义函数,可以做到下面的事情:

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

更新II

我现在将我的JSON函数移植到了它们自己的项目中:

PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数

admin 更改状态以发布 2023年5月23日
0
0 Comments

使用Postgres 9.3+,只需使用-> 运算符。例如,

SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;

查看http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/,了解一些不错的例子和教程。

0
0 Comments

Postgres 9.2

我引用了 Andrew Dunstan 在 pgsql-hackers 列表上的话

在某些情况下,可能会有一些 json 处理函数(与 json 生成函数不同),但不会在9.2版本中出现。

这并不妨碍他提供一个在 PLV8 中解决问题的示例实现。(链接现在已经失效,看看现代的PLV8)。

Postgres 9.3

新增了许多新功能和运算符,以添加“json 处理”。

在 Postgres 9.3 中的原始问题的答案:

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

高级示例:

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

Postgres 9.4

增加了jsonb(b表示“二进制”,值存储为本机的 Postgres 类型)和两种类型的更多功能。除了上面提到的表达式索引之外,jsonb 还支持GIN、btree 和 hash 索引,其中 GIN 是最强大的。

该手册甚至建议:

一般情况下,大多数应用程序应该将 JSON 数据存储为 jsonb,除非有相当专业的需求,比如关于对象键排序的传统假设。

我强调加粗。

由于 GIN 索引的一般改进而带来的性能优势。

Postgres 9.5

完整的jsonb函数和操作符。新增更多用于就地操作和呈现jsonb数据的函数。

0