HSTORE配列値をJSONBの列に変換する

Aug 22 2020

PostgresのHSTORE列(「データ」)に保存されているデータを変換しようとしています。

私の行の値にはキー「エンティティ」があり、値は配列にあります。

"entity"=>"[{'id': .............}]

次のコードを使用しました。

Alter TABLE my_table 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING hstore_to_jsonb_loose(data -> 'entity');

これにより、次のように新しい列に出力として値が表示されます。

"[{'id': .............}]"

しかし、引用符で""。これにより、JSONBタイプの列でスカラーになり、クエリを実行できなくなりました。

引用符なしで、JSONBを使用して「entity」という名前の新しい列のすべての行の値を変更するにはどうすればよいですか?

[{'id': .............}]

類似のデータを生成するためのサンプルコード:

"key" => "[json_text_array]"

hstoreデータ型列に格納されます。

JSON Bタイプに変更すると、取得しますが{'key':'[array]'}、後です{'key': [array]}-引用符はありません。私はpostgresで緩い関数を試しましたが、助けにはなりませんでした。

回答

2 AkhileshMishra Aug 24 2020 at 00:01

私が理解したあなたの質問によると、あなたはhstore名前が付けられたキーentityととしての値を持つタイプの列を持っていますJSON ARRAY。問題と解決策の説明は次のようになります。

  1. あなたのAlterためにクエリがエラーを通じて質問意志で述べたhstore_to_jsonb_loose関数が受け入れるhstore型の値をしかし、あなたが渡していますtext。したがって、クエリの正しいステートメントは次のようになります。
    Alter TABLE my_table 
       ALTER COLUMN h_store_column TYPE jsonb 
       USING hstore_to_jsonb_loose(data) -> 'entity';
  1. 上記のクエリは、hstoreキーと値をjsonbキーと値のペアに変換し、列に更新しますh_store_column

機能はそれほどhstore_to_jsonb_looseとしてデータを変換する{ "entity": "[{'id':..........}]" }、あなたの抽出されているから、JSONキーの値'entity'です"[{'id':..........}]"

  1. からフェッチした値hstore_to_jsonb_loose(data) -> 'entity'をfullとして保存する必要がありますJSON ARRAYhstoreタイプ列に値として格納されているデータは、のように見えますJSONが、ではありませんJSON。ではJSON、キーと値(数値とブール値を除く)はで囲まれて"いますが、文字列ではで囲まれてい'ます。そのためJSONJSONBタイプの列のように保存することはできません。

  2. JSONとしての値の構造に他の問題がないことを考慮すると(以外')。私たちは、交換する必要がある'"し、列にJSONBとして値を格納します。同じことをするためにこのクエリを試してください。

Alter TABLE test 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING replace(hstore_to_jsonb_loose(data)->>'entity','''','"')::jsonb;

デモ1

hstore_to_jsonb_looseあなたの場合でも必要ありません。あなたはAlter以下のようにあなたの声明を書くことができます:

Alter TABLE test 
   ALTER COLUMN h_store_column TYPE jsonb 
   USING replace((data)->'entity','''','"')::jsonb;

デモ2