hstore

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ

# 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` `?` `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"`

## 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 `<oleg@sai.msu.su>`, Moscow, Moscow University, Russia

Teodor Sigaev `<teodor@sigaev.ru>`, Moscow, Delta-Soft Ltd., Russia

前のページ | ホーム | 次のページ
fuzzystrmatch | 上に戻る | intagg