Переименование ключа hstore в PostgreSQL 9.2

Я оценивал функциональность PostgreSQL hstore (9.2) и единственное, что точное руководство не является явным о том, как переименовать ключи, Например, как я мог переименовать ключ c в ai_count?

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

Я думаю, что нет прямого способа сделать это, и что он включает дублирование ключа c клавишей ai_count, а затем отбрасывание клавиши c. Как я могу это сделать, идеально как однострочный, который может быть применен к нескольким записям?

Ответ 1

Я думаю, вы правы, что вам нужно вытащить старую пару и снова положить новую пару (с переименованным ключом).

Вы можете сделать это с помощью однострочного интерфейса:

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

где h - это hstore, from_key - это ключ, который вы хотите изменить, и to_key - это то, что вы хотите изменить. Это вернет новый hstore с желаемым изменением, но предполагает, что from_key находится в h; если from_key не находится в h, тогда вы получите to_key -> NULL в своем hstore. Если вы, как и все здравомыслящие люди, не хотите пустого 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"