私は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%';
私は今私のJSON関数を彼ら自身のプロジェクトに移しました:
PostSQL - PostgreSQLとPL/v8をまったく素晴らしいJSONドキュメントストアに変換するための一連の関数
私は pgsql-hackersメーリングリストのAndrew Dunstan を引用します。
ある段階では(jsonを生成するのではなく)何らかのjson処理関数があるかもしれませんが、9.2ではできません。
彼があなたの問題を解決するはずの PLV8の実装例 を提供するのを妨げません。
"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';
高度な例:
より大きなテーブルでは、パフォーマンスを向上させるために式インデックスを追加することができます。
jsonb
( "binary"の場合はb、値はネイティブPostgres型として格納されます)、さらに両方の機能を追加します タイプ。上記の式インデックスに加えて、jsonb
は GIN、btreeおよびhashインデックス もサポートしています。GINがこれらの中で最も強力です。
json
およびjsonb
データ型 および 関数 に関するマニュアル。マニュアルは示唆する限り行きます:
一般的に、ほとんどのアプリケーションは、オブジェクトキーの順序付けに関する従来の前提など、特別なニーズがない限り、JSONデータを
jsonb
として格納することを好みます。
私の大胆な強調.
GINインデックスの一般的な改善によるパフォーマンス上の利点。
完全なjsonb
の関数と演算子。その場で表示のためにjsonb
を操作する関数を追加します。
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/ を参照してください。
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)