hstore
hstore模块实现了一种数据类型,用于在单个Greenplum数据库数据字段中存储(键,值)对的集合。 这在各种情况下很有用,例如具有许多很少检查的属性的行或半结构化数据。
在当前的实现中,键和值字符串的长度都不能超过65535个字节。 如果超出此限制,将引发错误。 这些最大长度可能会在将来的版本中更改。
安装hstore
在使用hstore数据类型和函数之前, 请在要查询其他数据库的每个数据库中运行安装脚本$GPHOME/share/postgresql/contrib/hstore.sql:
$ psql -d testdb -f $GPHOME/share/postgresql/contrib/hstore.sql
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视为普通数据值,请使用双引号引起来。
当前,即使不是绝对必要,双引号始终用于在输出中包含键和值字符串。
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 |
Note: 不推荐使用\=>运算符,并且可能在以后的版本中将其删除。 请改用hstore(text, text)函数。
函数 | 返回类型 | 描述 | 示例 | 结果 |
---|---|---|---|---|
hstore(text, text) | hstore | 制作单项hstore | hstore(‘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’) |
|
avals(hstore) | text[] | 以数组形式获取hstore的值 | avals(‘a=>1,b=>2’) | {1,2} |
svals(hstore) | setof text | 以集合形式获取hstore的值 | svals(‘a=>1,b=>2’) |
|
each(hstore) | setof (key text, value text) | 以集合形式获取hstore的键值 | select * from each(‘a=>1,b=>2’) |
|
exist(hstore,text) | boolean | hstore是否包含键? | 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索引类型。例如:
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
...................