4

PostgreSQLの hstore列を、すべての hstore 行の個別のキーがテーブルの列を形成し、値が対応する列の行を埋める通常のテーブルに変換する SQL クエリはどれですか?

たとえば、hstore 列を変換するにはどうすればよいですか

hstore
------------------------------------
"a"=>"1", "b"=>"2", "c"=>"3"
"a"=>"4", "b"=>"6", "c"=>"5", "d"=>7
"a"=>"8", "b"=>"3", "c"=>"8"

「同等の」テーブルに

a   b   c   d
---------------
 1 | 2 | 3 |
 4 | 6 | 5 | 7 
 8 | 3 | 8 |

ここで、個別の hstore キー a、b、c、および d がテーブルの列を形成し、それらの値が各列の行を埋めますか?

4

2 に答える 2

5

これを動的に行うことはできませんが、出力に一致する型を作成すれば可能です。

create table foo (data hstore);
create type foo_type as (a text, b text, c text);

insert into foo (data) 
values 
('a => 1, b => 2'),
('a => 1, b=>2, c => 3'),
('a => 1');

select (populate_record(null::foo_type, data)).*
from foo;

戻り値:

| | b | c
--+---+--
1 | 2 |  
1 | 2 | 3
1 | | |  

必要な列に一致するテーブルがある場合は、「テーブル タイプ」も使用できることに注意してください。

于 2013-04-18T21:12:29.317 に答える
1

質問に回答があることは知っていますが、同様の問題に遭遇しました。データをテーブルに直接挿入できるように、hstore 値を変換する必要がありました。これは私が得た解決策です:

INSERT INTO foo 
SELECT (populate_record(null::foo, 'a => 1, b=>2, c => 3'::hstore)).*;

もちろん、hstore 列はテーブルに存在する必要があり、そうでない場合は無視されます。これが私のようにここにたどり着いた他の人々に役立つことを願っています。:)

于 2016-02-05T14:04:14.290 に答える