問合せ:
WITH RECURSIVE z3 AS (
WITH z2 AS (
WITH RECURSIVE z AS (
WITH x AS (
-- just your variable
SELECT '{"a":"foo", "b":"BARK", "c" :{ "d": "dog"}}'::jsonb AS j
) SELECT j,
ARRAY [ a ] AS a
FROM (
SELECT j,
jsonb_object_keys(j) AS a
FROM x
) AS a
UNION ALL SELECT j,
a || b
FROM (
SELECT j,
a,
jsonb_object_keys(j#>(a)) AS b
FROM z
WHERE j#>>(a) ~ '^\{.*\}$'
) AS A
) SELECT *,
dense_rank() OVER (ORDER BY a) AS i
FROM z
WHERE NOT j#>>(a) ~ '^\{.*\}$'
) SELECT i,
jsonb_set(j, a, to_jsonb(lower(j#>>(a)))) AS j
FROM (
SELECT * FROM z2 ORDER BY i LIMIT 1
) AS a
UNION ALL SELECT z2.i,
jsonb_set(z3.j,
z2.a,
to_jsonb(lower(z3.j#>>(z2.a))))
FROM z3
JOIN z2 ON (z2.i = z3.i + 1)
) SELECT j FROM z3 ORDER BY i DESC LIMIT 1;
いくつかの説明: zのCTEはjsonbオブジェクト内のすべての文字列を検索します。 'a'はjson文字列へのパスです。出力:
j | a | dense_rank
----------------------------------------------+-------+------------
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {a} | 1
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {b} | 2
{"a": "foo", "b": "BARK", "c": {"d": "dog"}} | {c,d} | 3
(3 rows)
z3とdense_rankは1回につき1つ(再帰呼び出し)に適用され、lower to jsonに適用されます。
これはjson/jsonbですか?なぜあなたは\を削除する必要がありますか?文字列 "c": "{\" d \ ":\" dog \ "}"の引用符であるため、 " –
\"が使用されています。 ?「} –
これはい、特に、ここで がコードであるJSON操作の結果であった:。 $$ )( ARRAY_AGG(キー選択json_objectとして機能update_info(情報jsonb) 戻りjsonb言語SQLを作成したり、交換してください。 、 ARRAY_AGG( ケースキー「B」、下位(値) 他の値の末尾)):: jsonb_each_textからjsonb (情報) $$; – vichsu