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

Tob*_*ede 208 sql postgresql json postgresql-9.2 postgresql-9.3

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

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

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]
Run Code Online (Sandbox Code Playgroud)

如何编写SQL以按名称查找记录?

在vanilla SQL中:

SELECT * from json_data WHERE "name" = "Toby"
Run Code Online (Sandbox Code Playgroud)

官方开发手册非常稀少:

更新我

我已经汇总了详细介绍PostgreSQL 9.2目前可能实现的内容.使用一些自定义函数,可以执行以下操作:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
Run Code Online (Sandbox Code Playgroud)

更新II

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

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

Erw*_*ter 172

Postgres 9.2

在pgsql-hackers列表中引用Andrew Dunstan:

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

不妨碍他在PLV8中提供应该解决您的问题的示例实现.

Postgres 9.3

提供一系列新功能和操作员来添加"json-processing".

Postgres 9.3中原始问题的答案:

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

高级示例:

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

Postgres 9.4

添加jsonb(b代表"二进制",值存储为本机Postgres类型),但两种类型的功能更多.除了上面提到的表达式索引,jsonb还支持GIN,btree和哈希索引,GIN是最有效的.

该手册甚至建议:

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

大胆强调我的.

性能受益于GIN索引的一般改进.

Postgres 9.5

完整的jsonb功能和操作员.添加更多功能以进行操作jsonb并进行显示.


Mee*_*ohi 85

使用Postgres 9.3+,只需使用->运算符即可.例如,

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

有关一些不错的示例和教程,请参阅http://clarkdave.net/2013/06/what-c​​an-you-do-with-postgresql-and-json/.

  • 如何查询是否有数组?我看到#>>运算符,但没有提示如何使用它! (6认同)
  • 这是如何运作的?不适合我! (2认同)
  • 在上面的例子中,你应该有一个名为`data`的字段和一个JSON文档:`{images:{thumbnail:{url:'thumbnail.jpg'}}}`.让我们知道您的数据是什么样的以及哪些查询失败了. (2认同)

jos*_*var 17

使用postgres 9.3使用 - >进行对象访问.4个例子

seed.rb

se = SmartElement.new
se.data = 
{
    params:
    [
        {
            type: 1,
            code: 1,
            value: 2012,
            description: 'year of producction'
        },
        {
            type: 1,
            code: 2,
            value: 30,
            description: 'length'
        }
    ]
}

se.save
Run Code Online (Sandbox Code Playgroud)

铁轨

SELECT data->'params'->0 as data FROM smart_elements;
Run Code Online (Sandbox Code Playgroud)

回报

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)
Run Code Online (Sandbox Code Playgroud)

您可以继续嵌套

SELECT data->'params'->0->'type' as data FROM smart_elements;
Run Code Online (Sandbox Code Playgroud)

返回

 data
------
 1
(1 row)
Run Code Online (Sandbox Code Playgroud)