web-dev-qa-db-ja.com

Postgres 9.4のjson_strip_nullsと同等

json_strip_nulls 関数は9.5で導入されました。 9.4で同等の結果が得られるものは何ですか?

基本的にはjson列であるtext列がありますが、内容はJSONであるため、セマンティックスの目的でjson列にしました。これで、nullにマッピングされた多くのキーがあり、スペースを浪費し、画面が乱雑になっています。

jsonbへのキャストおよびその逆のキャストはnullを削除しません。また、9.4はjson(b)を操作するための多くのツールを提供しません。

1
Kayaman

これは、カスタム集計と既存の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で利用可能な機能のみを使用したと思います。