hstore

hstore模块实现了一种数据类型,用于在单个Greenplum数据库数据字段中存储(键,值)对的集合。 这在各种情况下很有用,例如具有许多很少检查的属性的行或半结构化数据。

在当前的实现中,键和值字符串的长度都不能超过65535个字节。 如果超出此限制,将引发错误。 这些最大长度可能会在将来的版本中更改。

安装hstore

在使用hstore数据类型和函数之前, 请在要查询其他数据库的每个数据库中运行安装脚本$GPHOME/share/postgresql/contrib/hstore.sql:

  1. $ psql -d testdb -f $GPHOME/share/postgresql/contrib/hstore.sql

hstore外部表示

hstore值的文本表示形式包括零个或多个key\=>value项,以逗号分隔。 例如:

  1. k => v
  2. foo => bar, baz => whatever
  3. "1-a" => "anything at all"

项目的顺序不重要(并且可能不会在输出中复制)。 项目之间或\=>符号周围的空格将被忽略。 如果键或值包含空格,逗号,\=或>,请使用双引号。 要在键或值中包含双引号或反斜杠,请在其前面加上另一个反斜杠。 (请记住,根据standard_conforming_strings的设置,您可能需要在SQL文字字符串中加双反斜杠。)

值(但不是键)可以是SQL NULL。 这表示为

  1. key => NULL

NULL关键字不区分大小写。 同样,如果要将字符串null视为普通数据值,请使用双引号引起来。

当前,即使不是绝对必要,双引号始终用于在输出中包含键和值字符串。

hstore运算符和函数

Table 1. 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

Note: 不推荐使用\=>运算符,并且可能在以后的版本中将其删除。 请改用hstore(text, text)函数。

Table 2. hstore函数
函数返回类型描述示例结果
hstore(text, text)hstore制作单项hstorehstore(‘a’, ‘b’)“a”=>”b”
akeys(hstore)text[]以数组形式获取hstore的键akeys(‘a=>1,b=>2’){a,b}
skeys(hstore)setof text以集合形式获取hstore的键skeys(‘a=>1,b=>2’)
  1. a
  2. b
avals(hstore)text[]以数组形式获取hstore的值avals(‘a=>1,b=>2’){1,2}
svals(hstore)setof text以集合形式获取hstore的值svals(‘a=>1,b=>2’)
  1. 1
  2. 2
each(hstore)setof (key text, value text)以集合形式获取hstore的键值select * from each(‘a=>1,b=>2’)
  1. key | value
  2. ——-+———-
  3. a | 1
  4. b | 2
exist(hstore,text)booleanhstore是否包含键?exist(‘a=>1’,’a’)t
defined(hstore,text)boolean对于键hstore是否包含非空值?defined(‘a=>NULL’,’a’)f
delete(hstore,text)hstore删除匹配键的所有项delete(‘a=>1,b=>2’,’b’)“a”=>”1”

Indexes

hstore对@>和?运算符有索引支持。 您可以使用GiST或GIN索引类型。例如:

  1. CREATE INDEX hidx ON testhstore USING GIST(h);
  2. CREATE INDEX hidx ON testhstore USING GIN(h);

示例

添加键,或使用新键更新现有键:

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

删除键:

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

统计

hstore类型由于其固有的自由度,可能包含许多不同的键。 检查有效键是应用程序的任务。 下面的示例演示了几种用于检查键和获取统计信息的技术。

简单示例:

  1. SELECT * FROM each('aaa=>bq, b=>NULL, ""=>1');

使用表:

  1. SELECT (each(h)).key, (each(h)).value INTO stat FROM testhstore;

在线统计:

  1. SELECT key, count(*) FROM
  2. (SELECT (each(h)).key FROM testhstore) AS stat
  3. GROUP BY key
  4. ORDER BY count DESC, key;
  5. key | count
  6. -----------+-------
  7. line | 883
  8. query | 207
  9. pos | 203
  10. node | 202
  11. space | 197
  12. status | 195
  13. public | 194
  14. title | 190
  15. org | 189
  16. ...................