F.13. hstore

本モジュールは(キー、値)の組み合わせの集合を単一のPostgreSQLデータフィールドに格納するためのhstoreデータ型を実装します。 あまり確認されない属性を多くもつ行や半構造化データなど、多くの状況で有用になる可能性があります。

現在の実装では、キーも値の文字列も65535バイト長を超えられません。この限界を超えるとエラーが投げられます。これらの最大の長さは将来のリリースで変更される可能性があります。

F.13.1. hstoreの外部表現

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.13.2. hstoreの演算子と関数

表 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 ? texthstoreがキーを含むかどうか。'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 texthstoreのキーを集合として入手します。skeys('a=>1,b=>2')
a
b
avals(hstore)text[]hstoreの値を配列として入手します。avals('a=>1,b=>2'){1,2}
svals(hstore)setof texthstoreの値を集合として入手します。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)booleanhstoreがキーを含むかどうか。exist('a=>1','a')t
defined(hstore,text)booleanhstoreがキーに対して非NULLの値を持つかどうかdefined('a=>NULL','a')f
delete(hstore,text)hstoreキーに一致する項目をすべて削除します。delete('a=>1,b=>2','b')"a"=>"1"

F.13.3. インデックス

hstore@>および?演算子向けのインデックスをサポートします。 GiSTまたはGINという2種類のインデックスを使用することができます。 以下に例を示します。

CREATE INDEX hidx ON testhstore USING GIST(h);

CREATE INDEX hidx ON testhstore USING GIN(h);
  

F.13.4. 例

キーを追加、または、既存のキーを新しい値で更新します。

UPDATE tab SET h = h || ('c' => '3');
  

キーを削除します。

UPDATE tab SET h = delete(h, 'k1');
  

F.13.5. 統計情報

内在する自由度のため、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
...................
  

F.13.6. 作者

Oleg Bartunov , Moscow, Moscow University, Russia

Teodor Sigaev , Moscow, Delta-Soft Ltd., Russia