web-dev-qa-db-ja.com

NULLレコードのjsonbコンストラクターがhstoreコンストラクターのように動作しないのはなぜですか?

hstore を作成すると

CREATE EXTENSION hstore;
SELECT hstore(null::my_type);
                     hstore                     
------------------------------------------------
 "name"=>NULL, "street"=>NULL, "location"=>NULL
(1 row)

jsonb メソッドですが、

SELECT to_jsonb(null::my_type);
 to_jsonb 
----------

(1 row)

これは、マージしようとしたときにも驚くべき効果を生み出します(||)別の同様のタイプ、

SELECT hstore(null::my_type) || hstore('name', 'Evan');
                     ?column?                     
--------------------------------------------------
 "name"=>"Evan", "street"=>NULL, "location"=>NULL
(1 row)

SELECT to_jsonb(null::my_type) || jsonb_build_object('name', 'Evan');
 ?column? 
----------

(1 row)
1
Evan Carroll

ここでの回避策は、jsonb_populate_recordのプロキシによってjsonbを構築することです。

SELECT jsonb_populate_record(
  null::my_type,
  '{}'
);

または、レコードタイプを更新しようとしているだけの場合は、1回の呼び出しで直接更新できます。

SELECT jsonb_populate_record(
  null::my_type,
  jsonb_build_object('name', 'Evan')
);
0
Evan Carroll