2012-11-07 2 views
10

저는 PostgreSQL의 hstore 기능 (9.2)을 평가 해 왔으며 fine manual에서 키의 이름을 바꾸는 방법이 명시되어 있지 않습니다. 예를 들어 cai_count으로 바꾸려면 어떻게해야합니까?PostgreSQL 9.2에서 hstore 키의 이름 바꾸기

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

내가 거기에이 작업을 수행하는 직접적인 방법이 없다하고 다음 c 키를 삭제하는 ai_count 키에 c 키를 복제 관련된 것으로 생각하고있다. 여러 레코드에 적용 할 수있는 하나의 라이너로 이상적으로이 작업을 수행하려면 어떻게해야합니까?

답변

12

나는 당신이 다시에서 기존의 쌍을 끌어와 (이름을 바꾼 키) 새로운 쌍을 넣어해야한다는 맞아 생각

당신은 한 줄에 그것을 할 수 :.

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

여기에서 h은 hstore이고 from_key은 변경하려는 키이고 to_key은 변경하려는 항목입니다. 그러면 원하는 변경 사항이 적용된 새 펌웨어가 반환되지만 from_keyh에 있다고 가정합니다. from_keyh이 아니면 hstore에 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" 
+0

아름다운, 감사합니다. – Jeff

+0

한 번에 여러 개의 키 이름을 바꿀 때 hstore 열과 함께 약 1 백만 개의 레코드를 빠르게 처리 할 수있는 방법이 있습니까? 나는 9.3에있어. – szimek

+1

@szimek : AFAIK, 각 hstore를 열고 수정 한 다음 다시 넣어야합니다 (위와 같이 어려운 방법). 실제 PostgreSQL 전문가 중 일부가 도울 수 있도록 다른 질문을 시도해 볼 수 있습니다. –