hstore
Тип данных для хранения пар ключ/значение внутри одного значения.
Схема размещения:
ext
.Модуль реализует тип данных
hstore
для хранения пар ключ/значение внутри одного значения.Функциональность может быть полезна для хранения строк со множеством редко анализируемых атрибутов или частично структурированных данных. Ключи и значения задаются простыми текстовыми строками.
Применяемое для ввода и вывода текстовое представление типа
hstore
включает ноль или более пар ключ => значение
. Пары разделяются запятыми.Оператор | Результат | Описание | Пример |
---|---|---|---|
hstore -> text | text | Выдает значение для заданного ключа, или NULL , если он отсутствует | 'a=>x, b=>y'::hstore -> 'a' → x |
hstore -> text[] | text[] | Выдает значения, связанные с заданными ключами, или NULL , если таких ключей нет | 'a=>x, b=>y, c=>z'::hstore -> ARRAY['c','a'] → {"z","x"} |
hstore || hstore | hstore | Соединяет два набора hstore | 'a=>b, c=>d'::hstore 'c=>x, d=>q'::hstore → "a"=>"b", "c"=>"x", "d"=>"q" |
hstore ? text | boolean | Набор hstore включает ключ ? | 'a=>1'::hstore ? 'a' → t |
hstore ?& text[] | boolean | Набор hstore содержит все указанные ключи ? | 'a=>1,b=>2'::hstore ?& ARRAY['a','b'] → t |
hstore ?| text[] | boolean | Набор hstore содержит какой-либо из указанных ключей ? | 'a=>1,b=>2'::hstore ? ARRAY['b','c'] → t |
hstore @> hstore | boolean | Левый операнд содержит правый ? | 'a=>b, b=>1, c=>NULL'::hstore @> 'b=>1' → t |
hstore <@ hstore | boolean | Левый операнд содержится в правом ? | 'a=>c'::hstore <@ 'a=>b, b=>1, c=>NULL' → f |
hstore - text | hstore | Удаляет ключ из левого операнда | 'a=>1, b=>2, c=>3'::hstore - 'b'::text → "a"=>"1", "c"=>"3" |
hstore - text[] | hstore | Удаляет ключи из левого операнда | 'a=>1, b=>2, c=>3'::hstore - ARRAY['a','b'] → "c"=>"3" |
hstore - hstore | hstore | Удаляет из левого операнда пары ключ/значение, совпадающие с парами в правом | 'a=>1, b=>2, c=>3'::hstore - 'a=>4, b=>2'::hstore → "a"=>"1", "c"=>"3" |
anyelement #= hstore | anyelement | Заменяет поля в левом операнде, имеющем составной тип, соответствующими значениями из hstore | ROW(1,3) #= 'f1=>11'::hstore → (11,3) |
%% hstore | text[] | Преобразует hstore в массив перемежающихся ключей и значений | %% 'a=>foo, b=>bar'::hstore → {a,foo,b,bar} |
%# hstore | text[] | Преобразует hstore в двумерный массив ключей-значений | %# 'a=>foo, b=>bar'::hstore → {{a,foo},{b,bar}} |
Функция | Результат | Описание |
---|---|---|
hstore (record) | hstore | Формирует hstore из записи или кортежа |
hstore (text[]) | hstore | Формирует hstore из двумерного массива или из массива, содержащего перемежающиеся ключи-значения |
hstore (text[], text[]) | hstore | Формирует hstore из отдельных массивов ключей и значений |
hstore (text, text) | hstore | Формирует hstore с одним элементом |
akeys (hstore) | text[] | Извлекает ключи в виде массива |
skeys (hstore) | setof text | Извлекает ключи в виде множества |
avals (hstore) | text[] | Извлекает значения из в виде массива |
svals (hstore) | setof text | Извлекает значения в виде множества |
hstore_to_array (hstore) | text[] | Извлекает ключи и значения из hstore в виде массива перемежающихся ключей и значений |
hstore_to_matrix (hstore) | text[] | Извлекает ключи и значения из hstore в виде двумерного массива |
hstore_to_json (hstore) | json | Преобразует hstore в json , переводя все отличные от NULL значения в строки JSON |
hstore_to_jsonb (hstore) | jsonb | Преобразует hstore в jsonb , переводя все отличные от NULL значения в строки JSON |
hstore_to_json_loose (hstore) | json | Преобразует hstore в json , по возможности распознавая числовые и логические значения и передавая их в JSON без кавычек |
hstore_to_jsonb_loose (hstore) | jsonb | Преобразует hstore в jsonb , по возможности распознавая числовые и логические значения и передавая их в JSON без кавычек |
slice (hstore, text[]) | hstore | Извлекает из hstore подмножество, содержащее только заданные ключи |
each (hstore) | setof record (key text, value text) | Извлекает ключи и значения из hstore в виде набора записей |
exist (hstore, text) | boolean | Набор hstore включает ключ? |
defined (hstore, text) | boolean | Значение hstore содержит отличное от NULL значение для заданного ключа? |
delete (hstore, text) | hstore | Удаляет пару с соответствующим ключом |
delete (hstore, text[]) | hstore | Удаляет пары с соответствующими ключами |
delete (hstore, hstore) | hstore | Удаляет пары, соответствующие парам во втором аргументе |
populate_record (anyelement, hstore) | anyelement | Заменяет поля в левом операнде, имеющем составной тип, соответствующими значениями из hstore |
Тип
hstore
поддерживает индексы GiST и GIN для операторов @>
, ?
, ?&
и ?|
.Класс операторов GIST
gist_hstore_ops
аппроксимирует набор пар ключ/значение в виде сигнатуры битовой карты. Параметром siglen
, опционально, можно задать размер сигнатуры в байтах. Параметр может принимать значения от 1 до 1024, по умолчанию он равен 16. С увеличением размера сигнатуры поиск осуществляется точнее, так как сканируется меньшая область индекса и меньшее количество страниц. Сам индекс становится больше.Тип
hstore
также поддерживает индексы btree
и hash
для оператора =
. Это позволяет объявлять столбцы hstore
как уникальные (UNIQUE
) и использовать их в выражениях GROUP BY
, ORDER BY
или DISTINCT
. Порядок сортировки значений hstore
не имеет практического смысла, но эти индексы могут быть полезны для поиска по равенству.Существуют дополнительные расширения, реализующие трансформации типа
hstore
для языков PL/Perl и PL/Python:- расширения для PL/Perl называются hstore_plperl для доверенного и hstore_plperlu для недоверенного PL/Perl; если установить эти трансформации и указать их при создании функции, значения
hstore
будут отображаться в хеши Perl; - расширения для PL/Python называются hstore_plpythonu, hstore_plpython2u и hstore_plpython3u и при их использовании значения hstore будут отображаться в словари Python.
-
Добавление ключа или изменение значения для существующего ключа:
UPDATE tab SET h = h || hstore('c', '3');
-
Удаление ключа:
UPDATE tab SET h = delete(h, 'k1');
-
Приведение типа
record
к типуhstore
:CREATE TABLE test (col1 integer, col2 text, col3 text); INSERT INTO test VALUES (123, 'foo', 'bar'); SELECT hstore(t) FROM test AS t;
Пример результата запроса:hstore --------------------------------------------- "col1"=>"123", "col2"=>"foo", "col3"=>"bar" (1 row)
-
Создание индекса GIN:
CREATE INDEX hidx ON testhstore USING GIN (h);
-
Индексы для сравнений с помощью
=
:
-
btree
:CREATE INDEX hidx ON testhstore USING BTREE (h);
-
hash
:CREATE INDEX hidx ON testhstore USING HASH (h);
Дополнительную информацию по поставляемому модулю hstore можно получить по ссылке.