web-dev-qa-db-ja.com

新しい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"

公式の開発者マニュアルは非常にまばらです。

私を更新

私はまとめました 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ドキュメントストアに変換するための一連の関数

201
Toby Hede

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';

高度な例:

より大きなテーブルでは、パフォーマンスを向上させるために式インデックスを追加することができます。

Postgres 9.4

jsonb( "binary"の場合はb、値はネイティブPostgres型として格納されます)、さらに両方の機能を追加します タイプ。上記の式インデックスに加えて、jsonbGIN、btreeおよびhashインデックス もサポートしています。GINがこれらの中で最も強力です。

マニュアルは示唆する限り行きます:

一般的に、ほとんどのアプリケーションは、オブジェクトキーの順序付けに関する従来の前提など、特別なニーズがない限り、JSONデータをjsonbとして格納することを好みます。

私の大胆な強調.

GINインデックスの一般的な改善によるパフォーマンス上の利点。

Postgres 9.5

完全なjsonbの関数と演算子。その場で表示のためにjsonbを操作する関数を追加します。

168

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/ を参照してください。

78
Meekohi

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

レールc

SELECT data->'params'->0 as data FROM smart_elements;

戻る

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)

ネスティングを続けることができます

SELECT data->'params'->0->'type' as data FROM smart_elements;

戻る

 data
------
 1
(1 row)
16