jsonb_set関数
jsonb_set
関数はJSON文字列の要素を更新する関数。
以下の書式で定義される。
jsonb_set(target, path, new_value, [create_missing])
- target: 更新対象のJSON
- path: 更新する要素のパス
- new_value: 更新する値
- create_missing: パスで指定したキーが無い場合に追加しない場合は
false
を指定する
更新する要素のパス
要素のパスは{}
の中にカンマ区切りで指定する。
キーバリューの場合はキー名、配列の場合はインデックスを指定する。
例えば以下のようなJSONを考える。
{
"a": {
"b": {
"c": 1
}
}
}
上記JSONのc
までのパスは{a, b, c}
となる。
配列の場合はインデックスで指定する。
例えば以下のようなJSONの場合。
{
"a": [
{
"b": 1
},
{
"b": 2
}
]
}
1つ目のb
までのパスは{a, 0, b}
となり、2つ目のb
までのパスは{a, 1, b}
となる。
JSON文字列の要素を更新する
以下のJSONを考える。
{
"a": {
"b": {
"c": 1
}
}
}
上記JSONのc
の値を2
に更新するには以下のようにする。
SELECT jsonb_set('{"a": {"b": {"c": 1}}}', '{a, b, c}', '2');
# => {"a": {"b": {"c": 2}}}
以下の様に配列を含む場合。
{
"a": [
{
"b": 1
},
{
"b": 2
}
]
}
上記JSONの2つ目のb
の値を3
に更新するには以下のようにする。
SELECT jsonb_set('{"a": [{"b": 1}, {"b": 2}]}', '{a, 1, b}', '3');
# => {"a": [{"b": 1}, {"b": 3}]}
JSON文字列の要素を追加する
デフォルトではパスで指定したキーが無い場合に追加される。
SELECT jsonb_set('{"a": {"b": 1}}', '{a, c}', '2');
# => {"a": {"b": 1, "c": 2}}
上記SQLでは{"a": {"b": 1}}
に{a, c}
のパスにキーが存在しないため、c
が追加されている。
パスで指定したキーが無い場合に追加しないようにする
jsonb_set
の第4引数にfalse
を指定すると、パスで指定したキーが無い場合に追加されない。
SELECT jsonb_set('{"a": {"b": 1}}', '{a, c}', '2', false);
# => {"a": {"b": 1}}
上記SQLでは{"a": {"b": 1}}
に{a, c}
のパスにキーが存在おらず、第4引数にfalse
を指定しているため、c
が追加されていない。
jsonb_insert関数
jsonb_insert
関数はJSON文字列の指定した箇所の配列に要素を追加する関数。
以下の書式で定義される。
jsonb_insert(target, path, new_value, [after])
- target: 更新対象のJSON
- path: 更新する要素のパス
- new_value: 更新する値
- after: 指定したキーの後に追加する場合はそのキー名を指定する
パスの指定方法はjsonb_set
と同じ。
配列に要素を追加する
以下のJSONを考える。
{
"a": {
"b": [0, 1, 2]
}
}
上記JSONのb
の配列に3
を追加するには以下のようにする。
SELECT jsonb_insert('{"a": {"b": [0, 1, 2]}}', '{a, b, 2}', '3', true);
# => {"a": {"b": [0, 1, 2, 3]}}
インデックスに2
を指定し、第4引数にtrue
を指定している。
先頭に追加する場合はインデックスを0
とし、第4引数にfalse
を指定する。
SELECT jsonb_insert('{"a": {"b": [0, 1, 2]}}', '{a, b, 0}', '3', false);
# => {"a": {"b": [3, 0, 1, 2]}}
第4引数のデフォルト値はfalse
なので省略してもよい。
SELECT jsonb_insert('{"a": {"b": [0, 1, 2]}}', '{a, b, 0}', '3');
# => {"a": {"b": [3, 0, 1, 2]}}
\第一線のプログラマーの行動原理を学べる!/