json_strip_nulls 関数は9.5
で導入されました。 9.4
で同等の結果が得られるものは何ですか?
基本的にはjson
列であるtext
列がありますが、内容はJSONであるため、セマンティックスの目的でjson
列にしました。これで、nullにマッピングされた多くのキーがあり、スペースを浪費し、画面が乱雑になっています。
jsonb
へのキャストおよびその逆のキャストはnullを削除しません。また、9.4
はjson(b)を操作するための多くのツールを提供しません。
これは、カスタム集計と既存のjsonb機能を使用して実行できると思います。
次の集約は、2つのjsonb値を1つに「マージ」します。本質的にはa || b
と同じです(aおよびbはjsonb値です)が、複数行の集約として。
create aggregate jsonb_merge(jsonb)
(
sfunc = jsonb_concat(jsonb, jsonb),
stype = jsonb
);
その集計を使用すると、null値のキーを削除する再帰関数を作成できます。
create function strip_nulls(p_input jsonb)
returns jsonb
as
$$
select jsonb_aggregate(o)
from (
select jsonb_build_object(t.k, case jsonb_typeof(t.v) when 'object' then strip_nulls(t.v) else t.v end) o
from jsonb_each(p_input) as t(k,v)
where t.v::text <> 'null'
) t;
$$
language sql;
内部選択は、jsonb値を一連のキー/値ペアに変換し、null
値を再帰的に削除します。次に、結果の値がjsonbオブジェクトに集計されます。
select strip_nulls('{"one": null,
"two": 2,
"three": {"four": 1, "five": null,
"six": {"seven": 7, "eight": null}
}
}'::jsonb)
戻り値:
strip_nulls
-----------------------------------------------------
{"two": 2, "three": {"six": {"seven": 7}, "four": 1}}
結果はjson
にキャストバックできます
私はテスト用にPostgres 9.4をインストールしていませんが、9.4で利用可能な機能のみを使用したと思います。