227

PostgreSQL9.2の新しいJSON関数のドキュメントや例を探しています。

具体的には、一連のJSONレコードが与えられます。

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

名前でレコードを検索するSQLを作成するにはどうすればよいですか?

バニラSQLの場合:

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

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

更新I

PostgreSQL9.2で現在可能なことを詳しく説明した要点をまとめました。いくつかのカスタム関数を使用すると、次のようなことが可能です。

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

アップデートII

これで、JSON関数を独自のプロジェクトに移動しました。

PostSQL -PostgreSQLとPL/v8を完全に素晴らしいJSONドキュメントストアに変換するための一連の関数

4

3 に答える 3

186

Postgres 9.2

AndrewDunstanをpgsql-hackersリストに引用します:

ある段階で、(json-produceとは対照的に)いくつかのjson-processing関数が存在する可能性がありますが、9.2には存在しません。

彼があなたの問題を解決するはずのPLV8の実装例を提供することを妨げません。(リンクは現在無効です。代わりに最新の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(「バイナリ」の場合はb、値はネイティブのPostgresタイプとして保存されます)、さらに両方のタイプの機能が追加されます。上記の式インデックスに加えて、GIN、btree、およびハッシュインデックスjsonbもサポートします。これらの中で、GINが最も強力です。

マニュアルは、次のことを示唆しているところまで行きます。

一般に、ほとんどのアプリケーションは、オブジェクトキーの順序に関する従来の仮定など、非常に特殊なニーズがない限り、JSONデータをとして保存することを選択 する必要があります。jsonb

大胆な強調鉱山。

パフォーマンスは、GINインデックスの一般的な改善から恩恵を受けます。

Postgres 9.5

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

于 2012-05-12T03:10:59.240 に答える
94

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

于 2014-03-20T16:01:55.180 に答える
19

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)
于 2014-03-27T12:27:51.390 に答える