HSTORE配列値をJSONBの列に変換する
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で緩い関数を試しましたが、助けにはなりませんでした。
回答
私が理解したあなたの質問によると、あなたはhstore
名前が付けられたキーentity
ととしての値を持つタイプの列を持っていますJSON ARRAY
。問題と解決策の説明は次のようになります。
- あなたの
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';
- 上記のクエリは、
hstore
キーと値をjsonbキーと値のペアに変換し、列に更新しますh_store_column
。
機能はそれほどhstore_to_jsonb_loose
としてデータを変換する{ "entity": "[{'id':..........}]" }
、あなたの抽出されているから、JSON
キーの値'entity'
です"[{'id':..........}]"
。
からフェッチした値
hstore_to_jsonb_loose(data) -> 'entity'
をfullとして保存する必要がありますJSON ARRAY
。hstore
タイプ列に値として格納されているデータは、のように見えますJSON
が、ではありませんJSON
。ではJSON
、キーと値(数値とブール値を除く)はで囲まれて"
いますが、文字列ではで囲まれてい'
ます。そのためJSON
、JSONBタイプの列のように保存することはできません。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