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

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

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

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


person Jeff    schedule 07.11.2012    source источник


Ответы (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"
person mu is too short    schedule 07.11.2012
comment
Есть ли способ сделать это быстро для ~ 1 миллиона записей с помощью столбца hstore при одновременном переименовании нескольких ключей? Я на 9.3. - person szimek; 14.04.2014
comment
@szimek: Насколько я знаю, вам придется открывать каждый hstore, исправлять его и возвращать обратно (т. Е. Сложный способ, как указано выше). Вы можете попробовать задать другой вопрос, чтобы некоторые из настоящих экспертов PostgreSQL могли помочь. - person mu is too short; 14.04.2014
comment
чтобы избежать добавления значений NULL, вы можете отфильтровать записи, которые вы обновляете, с помощью WHERE h ? from_key - person Jared; 07.11.2017