本モジュールは(キー、値)の組み合わせの集合を単一のPostgreSQLデータフィールドに格納するためのhstoreデータ型を実装します。 あまり確認されない属性を多くもつ行や半構造化データなど、多くの状況で有用になる可能性があります。
現在の実装では、キーも値の文字列も65535バイト長を超えられません。この限界を超えるとエラーが投げられます。これらの最大の長さは将来のリリースで変更される可能性があります。
hstore値のテキスト表現はカンマで区切られた、ゼロ以上のkey => valueという項を含みます。 以下に例を示します。
k => v foo => bar, baz => whatever "1-a" => "anything at all"
項目の順序は重要ではありません(出力時に再現されないこともあります)。 項目間や=>記号前後の空白文字は無視されます。 キーや値が空白文字、カンマ、=、>を含む場合は二重引用符を使用してください。 キーや値に二重引用符やバックスラッシュを含めるには、その前にバックスラッシュを付けてください。 (standard_conforming_stringsの設定に依存しますが、SQLリテラル文字列内でバックスラッシュを二重にする必要があるかもしれないことを忘れないでください。)
値はSQLのNULLを取ることができます(キーは不可)。これは以下のように表現されます。
key => NULL
NULLキーワードは大文字小文字の区別はありません。 繰り返しますが、nullを普通のデータ値として扱いたい場合は二重引用符を使用してください。
現時点では、出力時、厳密に必要がない場合であっても、常にキーと値は二重引用符で括られます。
表 F-5. hstore演算子
演算子 | 説明 | 例 | 結果 |
---|---|---|---|
hstore -> text | キーの値を取り出します(存在しなければNULL) | 'a=>x, b=>y'::hstore -> 'a' | x |
text => text | 単一のhstore項目を作成します。 | 'a' => 'b' | "a"=>"b" |
hstore || hstore | 連結します。 | 'a=>b, c=>d'::hstore || 'c=>x, d=>q'::hstore | "a"=>"b", "c"=>"x", "d"=>"q" |
hstore ? text | hstoreがキーを含むかどうか。 | 'a=>1'::hstore ? 'a' | t |
hstore @> hstore | 左辺は右辺を含むかどうか。 | 'a=>b, b=>1, c=>NULL'::hstore @> 'b=>1' | t |
hstore <@ hstore | 左辺は右辺に含まれるかどうか。 | 'a=>c'::hstore <@ 'a=>b, b=>1, c=>NULL' | f |
(PostgreSQL 8.2以前では、含有演算子@>と<@はそれぞれ@と~と呼ばれていました。 これらの名前はまだ利用できますが、廃止予定であり、最終的にはなくなります。 古い名前がコアの幾何データ型が従う規約と反対であることに注意してください。)
表 F-6. hstoreの関数
関数 | 戻り値の型 | 説明 | 例 | 結果 |
---|---|---|---|---|
akeys(hstore) | text[] | hstoreのキーを配列として入手します。 | akeys('a=>1,b=>2') | {a,b} |
skeys(hstore) | setof text | hstoreのキーを集合として入手します。 | skeys('a=>1,b=>2') | a b |
avals(hstore) | text[] | hstoreの値を配列として入手します。 | avals('a=>1,b=>2') | {1,2} |
svals(hstore) | setof text | hstoreの値を集合として入手します。 | svals('a=>1,b=>2') | 1 2 |
each(hstore) | setof (key text, value text) | hstoreのキーと値を集合として入手します。 | select * from each('a=>1,b=>2') | key | value -----+------- a | 1 b | 2 |
exist(hstore,text) | boolean | hstoreがキーを含むかどうか。 | exist('a=>1','a') | t |
defined(hstore,text) | boolean | hstoreがキーに対して非NULLの値を持つかどうか | defined('a=>NULL','a') | f |
delete(hstore,text) | hstore | キーに一致する項目をすべて削除します。 | delete('a=>1,b=>2','b') | "a"=>"1" |
hstoreは@>および?演算子向けのインデックスをサポートします。 GiSTまたはGINという2種類のインデックスを使用することができます。 以下に例を示します。
CREATE INDEX hidx ON testhstore USING GIST(h); CREATE INDEX hidx ON testhstore USING GIN(h);
キーを追加、または、既存のキーを新しい値で更新します。
UPDATE tab SET h = h || ('c' => '3');
キーを削除します。
UPDATE tab SET h = delete(h, 'k1');
内在する自由度のため、hstore型は異なるキーを多く含むことができます。 有効なキーを検査することはアプリケーション側の作業です。 以下の例では、キー検査および統計情報の入手に関する複数の技法を示します。
簡単な例を示します。
SELECT * FROM each('aaa=>bq, b=>NULL, ""=>1');
テーブルを使用する例です。
SELECT (each(h)).key, (each(h)).value INTO stat FROM testhstore;
オンライン統計値です。
SELECT key, count(*) FROM (SELECT (each(h)).key FROM testhstore) AS stat GROUP BY key ORDER BY count DESC, key; key | count -----------+------- line | 883 query | 207 pos | 203 node | 202 space | 197 status | 195 public | 194 title | 190 org | 189 ...................
Oleg Bartunov <oleg@sai.msu.su>
, Moscow, Moscow University, Russia
Teodor Sigaev <teodor@sigaev.ru>
, Moscow, Delta-Soft Ltd., Russia