10

私は PostgreSQL の hstore 機能 (9.2) を評価してきましたが、細かいマニュアルで明示されていないのは、キーの名前を変更する方法だけです。たとえば、キーの名前を に変更するにはどうすれcばよいai_countですか?

"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"

これを行う直接的な方法はなく、cキーをキーに複製してからキーai_countをドロップする必要があると思いcます。理想的には、複数のレコードに適用できるワンライナーとして、これを行うにはどうすればよいですか?

4

1 に答える 1

13

古いペアを引き出して、新しいペア (名前が変更されたキーを使用) を元に戻す必要があることは正しいと思います。

ワンライナーでそれを行うことができます:

(h - from_key) || hstore(to_key, h -> from_key)

hhstore はどこにあり、from_keyは変更したいキーであり、 は変更しto_keyたいものです。これは、目的の変更を含む新しい hstore を返しますが、それが ; にあると想定していfrom_keyますh。ない場合from_keyは、hstorehに aが格納されます。to_key -> NULLすべての正気な人々のように、迷子の NULL を望まない場合は、ロジックを単純な関数にラップして、存在チェックを簡単に追加できるようにします。このようなもの:

create or replace function
change_hstore_key(h hstore, from_key text, to_key text) returns hstore as $$
begin
    if h ? from_key then
        return (h - from_key) || hstore(to_key, h -> from_key);
    end if;
    return h;
end
$$ language plpgsql;

次に、これらの両方を言って、期待される結果を得ることができます。

=> select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'b', 'pancakes');
      change_hstore_key       
------------------------------
 "pancakes"=>"2", "a"=>"1", "c"=>"3"

=> select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'pancakes', 'X');
      change_hstore_key       
------------------------------
 "a"=>"1", "b"=>"2", "c"=>"3"
于 2012-11-07T19:13:04.637 に答える