2016-10-09 4 views
3

IはMUのPostgreSQL 9.05でこれらのテーブルを持っている:jsonオブジェクトをpostgresqlの列として取得するには?

表:core フィールド(例えば)でnamedescriptiondata

dataフィールドは、JSONフィールドである:{"id": "100", "tax": "4,5"}

は常ににoneデータあたりのjson。

質問:私はすべてのJSONフィールドをクエリフィールドとして取得できますか? name, description, id, tax....

私のJSONにはさまざまなフィールドがありますが、ID、税金などが問題になります。

+1

参照[Postgresの:JSONBフィールドから集約されたキー/値のペアを平ら?](http://stackoverflow.com/a/ 35179515/1995738) – klin

答えて

5

「動的に」することはできません。必要な列を指定する必要があります。

select name, description, id, 
     data ->> 'tax' as tax, 
     data ->> 'other_attribute' as other_attribute 
from core; 

これをたくさん行う場合は、その列をビューに配置するとよいでしょう。


別のオプションは、例えば、あなたのJSONに属性を表しPostgresのでオブジェクト型を作成することです

create type core_type as (id integer, tax numeric, price numeric, code varchar); 

あなたは、その型にJSONをキャストすることができますし、JSONから対応する属性が自動的に列に変換されます。

上記のタイプと、次のJSONで:{"id": "100", "tax": "4.5", "price": "10", "code": "YXCV"}あなたが行うことができます。

select id, (json_populate_record(null::core_object, data)).* 
from core; 

、それが返されます:

id | tax | price | code 
---+------+-------+----- 
1 | 4.50 | 10 | YXCV 

しかし、すべてのJSON値に対応するオブジェクトフィールドの型にキャストできることを確認する必要があります。

オブジェクトタイプを変更すると、オブジェクトタイプを使用するクエリは自動的に更新されます。したがって、関心のある列を集中定義で管理することができます。

+0

ありがとう、しかし、私はすべての列がjson内にあることがわかりません、1または2 ..または10 ...私は動的にそれを行うことができますか? –

+0

@fh_bash:私が言ったように:あなたはそれを "動的に"行うことはできません。 SQLでは、クエリが実行される前にクエリの列数を定義しなければなりません。結果のすべての行は同じ数の列を持つ必要があります。 –

0

PostgreSQL 9.4では、json_to_recordも使用できます。

JSONオブジェクトから任意のレコードを作成します(下記を参照)。レコードを返すすべての関数と同様に、呼び出し側はAS句を使用してレコードの構造を明示的に定義する必要があります。例えば

select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text) 

戻り

a | b | d 
---+---------+--- 
1 | [1,2,3] | 
関連する問題