パート1:
私はPostgres 9.5を使用しており、JSONの配列を使用してpostgresテーブルにINSERTする方法を理解しようとしています。次のコマンドでテーブルを作成しました。
CREATE TABLE inputtable (
data_point_id SERIAL PRIMARY KEY NOT NULL,
chart_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
properties jsonb NOT NULL
);
Jsonデータ形式は次のようになります。
[
{ col1: a, col2: 5, col3: 1, col4: one},
{ col1: b, col2: 6, col3: 2, col4: two},
{ col1: c, col2: 7, col3: 3, col4: three}
]
いくつかの変更により、user_idに基づいて、行ごとにjsonオブジェクトを挿入できるようになりました。最後に、出力を次のようにします。
data_point_id | chart_id | user_id | properties
---------------+----------+----------+--------------
1 | 1 | 1 | { "col1": "a", "col2": 1, "col3": 1, "col4": "one"}
2 | 1 | 1 | { "col1": "b", "col2": 2, "col3": 2, "col4": "two"}
3 | 1 | 1 | { "col1": "c", "col2": 3, "col3": 3, "col4": "three"}
Unnestを使用してテーブルにデータを挿入しようとしましたが、
INSERT INTO inputtable (user_id, chart_id, properties)
SELECT (1, 1, unnest('{ "col1": "a", "col2": 1, "col3": 1, "col4": "one"},{ "col1": "b", "col2": 2, "col3": 2, "col4": "two"},{ "col1": "c", "col2": 3, "col3": 3, "col4": "three"}')::json)
タイプERROR: could not determine polymorphic type because input has type "unknown"
に関するエラーが表示されます。
パート2:
このようなテーブルを更新する方法についても知りたいです。たとえば、JSON形式でデータポイントを変更し、プロパティを変更したいのですが、次のような出力が期待されます。
data_point_id | chart_id | user_id | properties
---------------+----------+----------+--------------
1 | 1 | 1 | { "col1": "a", "col2": 6, "col3": 7, "col4": "eight"}
2 | 1 | 1 | { "col1": "b", "col2": 10, "col3": 11, "col4": "twelve"}
3 | 1 | 1 | { "col1": "c", "col2": 3, "col3": 3, "col4": "new"}
そのようなデータを使用する:
[
{ col1: a, col2: 6, col3: 7, col4: eight},
{ col1: b, col2: 10, col3: 11, col4: twelve},
{ col1: c, col2: 3, col3: 3, col4: new}
]
どうすればこれを達成できますか?パート2の質問はjsonb_populate_recordsetで解決できると思いますが、よくわかりません。 JSONにPostgresを使用するのは初めてですが、非常に強力に見えます。これを理解するための支援に感謝します!
unnest()
を使用する必要はありませんが、jsonb_array_elements()
を使用して、JSONデータ構造に角括弧を追加します。 JSONlint のようなJSONバリデーターWebサイトを使用して、JSONデータの正確性をテストすることをお勧めします。
このコードは、inputtable
に3つの新しいレコードを挿入します。
WITH json_array AS (
SELECT 1 AS user_id,
2 AS chart_id,
jsonb_array_elements('
[
{
"col1": "a",
"col2": 1,
"col3": 1,
"col4": "one"
}, {
"col1": "b",
"col2": 2,
"col3": 2,
"col4": "two"
}, {
"col1": "c",
"col2": 3,
"col3": 3,
"col4": "three"
}
]'::jsonb) AS properties
)
INSERT INTO inputtable (user_id, chart_id, properties)
SELECT * FROM json_array
更新するには、data_point_id
の値を指定する必要があるため、それらを知る必要がありますアプリオリ。
これは完全に機能しますが、おそらく他のnaive解決策があります:
WITH update_table AS(
SELECT unnest(ARRAY[1, 2, 3]) AS data_point_id,
jsonb_array_elements('
[
{
"col1": "a",
"col2": 6,
"col3": 7,
"col4": "eight"
}, {
"col1": "b",
"col2": 10,
"col3": 11,
"col4": "twelve"
}, {
"col1": "c",
"col2": 3,
"col3": 3,
"col4": "new"
}
]'::jsonb) AS properties
FROM inputtable
)
UPDATE inputtable
SET properties = update_table.properties
FROM update_table
WHERE inputtable.data_point_id = update_table.data_point_id