postgresのjsonbプロパティの利用について
jsonbの簡単な操作(追加、削除、変更)
1, 更新操作 (attributes 属性は jsonb 型)
メソッドの定義です。
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
パラメータです。
target
: 対象(jsonb 型の属性)
path
path : パス、jsonbが配列の場合 '{0, a}' は添え字が0の位置のaプロパティを更新することを意味し、配列でなくオブジェクトの場合は '{a}' と記述します。
new_value
: 新しい値
オプションのパラメータ: create_missing: jsonbフィールドにf1属性がない場合に作成、デフォルトはtrue
戻り値:更新されたjsonb
公式ドキュメントでは、以下のような例(jsonb配列)が示されています。
jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false)
Result: [{"f1":[2,3,4],"f2":null},2,null,3]
jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}', '[2,3,4]')
Result: [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]
jsonb属性を更新します。
-- attributes are jsonb type fields (objects converted to json)
original value: {"a":"1"}
update user_test set attributes = jsonb_set(attributes,'{a}','"0"'::jsonb, false) where id = '8888';
After execution: {"a":"0"}
jsonbの属性を挿入します。
-- After execution the attributes field adds platform: baidu
update user_test set attributes = attributes::jsonb || '{"platform":"baidu"}'::jsonb;
Alternatively.
update user_test set attributes = jsonb_set(attributes, '{platform}','"baidu"');
クエリ
select value from json_each('{"a":"foo", "b":"bar"}') where key = 'a'
select * from json_object_keys('{"a":"foo", "b":"bar"}')
select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b& quot;}}')
select * from json_object_keys(from ci_type.attributes);--error
select * from to_jsonb('"a":1,"b":2')
select '{"a":1,"b":2}'::json->>'b' --get the value of the corresponding key in jsonb (text)
--select * from json_each( to_jsonb(select distinct attributes from ci_type ) )
--select to_jsonb(select distinct attributes from ci_type )
--extend the field to extract the value of the corresponding attribute
select attributes :: json->>'instanceType' from ci_type
-- attributes values to jsonb
select to_jsonb('id:'||id::text) from ci
--jsonb add attribute, delete attribute
select '{"a":"foo", "b":"bar"}'::jsonb || '{"c":"fc", "d":" bdd"}'::jsonb - add
select '{"a":"foo", "b":"bar"}'::jsonb -'c'-'d'-'a'|||'{"a":2}' - delete
select '{"a": "b","c":3}'::jsonb - 'a'
-- Get json object by path: #>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{ b,ba}'
Result: "b1"
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> '{ b}'
Result: {"ba":"b1","bb":"b2"}
-- Get json object as text based on path: #>>
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #>& gt; '{b,ba}'
Result: "b1"
を追加しましょう。
1. to_jsonb()メソッドは1つの引数を受け取り、その引数をjsonbに変換します。
jsonb stores the millisecond value field
# Update the create_time field in the attributes field in the user table to the current time
update user_test
set attributes = jsonb_set(attributes,'{create_time}',to_jsonb(extract(epoch from now())*1000), true)
2. extract(epoch from now())*1000 ミリ秒の値を取得する。
EXTRACT(field FROM source)
フィールドは取得する時間オブジェクトを、ソースは取得する日付ソースを示し、タイプはtimestamp、time、またはintervalである。
EXAMPLE:select extract(year from now());
extract(epoch from now())
1970-01-01 00:00:00 UTC までの秒数を確認します。
epoch
:Epochはターゲットタイムと1970-01-01 00:00:00 UTCの間の秒数で、ターゲットタイムと1970-01-01 00:00:00 UTCの間の秒数差です。
Postgresql が jsonb 配列を操作する
まず、テーブルの構造を見てみましょう。
create table person
(id int, -- unique identifier
label jsonb); -- array of labels for the person (specifying which company the person is from), one object at a time
ラベルフィールドデータの例
[{"id":1,"code":"p123","name":"ali"},{"id":2,"code":" p123","name":"ali"}]
要件:タグの追加、タグの削除、タグのクリアを実装するSQLを作成する。
1. タグの追加
2つのjsonbを||記号で直接1つのjsonbに結合します。
-- when label is null
update person set label = '{"id":1,"code":"p123","name":"ali"}'::jsonb;
-- run when label is not null
update person set label = '{"id":1,"code":"p123","name":"ali"}'::jsonb || label
注意:ラベルがNULLの場合、結果もNULLになります
2. ラベルをクリアする
これは比較的簡単で、nullに設定するだけです。
update person set label = null;
3. ラベルの削除
これは少しトリッキーなことで、私は
-> ->> jsonb_array_elements() jsonb_build_array() array()
これらの記号や関数の使い方に馴染みのない方は、こちらをご覧ください。 http://www.postgres.cn/docs/10/datatype-json.html
update person
set label = jsonb_build_array(
array( -- Without this function, an error will be reported when filtering out more than 2 hops of data, because the jsonb_build_array function can only have one json
(select * from
(select jsonb_array_elements(label)j from person where id = 1) as a
where (j->>'id')::int <> 1) -- filter out the objects to be deleted
)
)->0 -- if you don't add this you get two arrays of [[]]s
where id = 1;
以上、pg で jsonb 配列を操作するための私の解決策を紹介しましたが、参考になれば幸いです。
関連
-
postgresql 重複データ削除 ケーススタディ
-
PostgreSQLのテーブルをパーティション分割する3つの方法
-
Postgresqlの行から列への高度な応用と要約のアイデア
-
postgresqlにおける時間処理のコツ(推奨)
-
Postgresqlへのリモートアクセスの設定方法(ファイアウォールの設定またはOFFが必要です。)
-
エクセルテーブルのデータをpostgresqlのデータベースにインポートする方法
-
Postgresql データベース timescaledb timescaledb 問題 大容量データテーブルをスーパーテーブルに変換すること
-
pgAdmin for postgreSQLでサーバーのデータをバックアップする方法
-
postgreSQLのクエリ結果に自己インクリメントシーケンス演算が追加されました。
-
Postgresqlのデータベースにおける配列の作成と変更に関する操作
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Postgresqlのユーザーログインエラーの回数を制限するサンプルコード
-
PostgreSQLで文字列が対象の文字列を含むかどうかを判断する様々な方法
-
どのように定期的にLinux上でpostgresqlのデータベースをバックアップする
-
Postgresqlのデータベース権限まとめ
-
postgresql いくつかのメソッドは、要約の重複するデータを削除する
-
Postgresqlのデータマージ、複数のデータを1つの操作にマージする。
-
Postgresqlのデータは、2つのフィールドを追加し、一意の操作を統合する
-
Postgresqlのシーケンススキップの問題を解決する
-
oracle_fdwを介してOracleデータにアクセスするためのPostgreSQLの手順
-
postgresqlのjsonbデータの問い合わせと変更方法