web-dev-qa-db-ja.com

複数の新しい列でhstoreを更新する

PostgreSQLデータベースに2つの新しいhstoreキー/値のペアを追加しようとしています。これを1つのステートメントで行うことは可能ですか、それとも分割する必要がありますか?ここに私が今持っているものがあり、それは機能していません。

with foo as (
   select 
          id, 
          new_value_1,
          new_value_2
   from table 3
)
update public.table1
    set hstore = hstore('new_key_1',foo.new_value_1),
        hstore = hstore('new_key_2',foo.new_value_2)
    where id = foo.id

更新で同じ行を2回続けて呼び出すことができないというエラーが発生します。上記のfooステートメントで選択した2つの異なる値を、既存の列のhstoreに新しいキーを持つ値としてhstoreにどのように挿入できますか?行にタグを付けるだけで、値が変更されても、元の値は将来の問題解決のために保存されます。

1
Kyle K

あなたはそれらを連結することができます:

set hstore_col = hstore('new_key_1',foo.new_value_1)||hstore('new_key_2',foo.new_value_2)

または、2つの配列を受け入れるコンストラクター関数を使用します。

set hstore_col = hstore(array['new_key_1', 'new_key_2'],array[foo.new_value_1, foo.new_value_2])

2つ目のソリューションは、キーが2つではなく2つある場合に拡張が簡単

現在の値を上書きしたくない場合は、それを元の値に追加します。

set hstore_col = hstore_col || hstore('new_key_1',foo.new_value_1)||hstore('new_key_2',foo.new_value_2)

または

set hstore_col = hstore_col || hstore(array['new_key_1', 'new_key_2'],array[foo.new_value_1, foo.new_value_2])