Перейти к основному содержимому

hstore. Тип данных для хранения пар ключ/значение внутри одного значения

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Модуль реализует тип данных hstore для хранения пар ключ/значение внутри одного значения.

Функциональность может быть полезна для хранения строк со множеством редко анализируемых атрибутов или частично структурированных данных. Ключи и значения задаются простыми текстовыми строками.

Применяемое для ввода и вывода текстовое представление типа hstore включает ноль или более пар ключ => значение. Пары разделяются запятыми.

Операторы

ОператорРезультатОписаниеПример
hstore -> texttextВыдает значение для заданного ключа, или 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 || hstorehstoreСоединяет два набора hstore'a=>b, c=>d'::hstore 'c=>x, d=>q'::hstore → "a"=>"b", "c"=>"x", "d"=>"q"
hstore ? textbooleanНабор 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 @> hstorebooleanЛевый операнд содержит правый?'a=>b, b=>1, c=>NULL'::hstore @> 'b=>1' → t
hstore <@ hstorebooleanЛевый операнд содержится в правом?'a=>c'::hstore <@ 'a=>b, b=>1, c=>NULL' → f
hstore - texthstoreУдаляет ключ из левого операнда'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 - hstorehstoreУдаляет из левого операнда пары ключ-значение, совпадающие с парами в правом'a=>1, b=>2, c=>3'::hstore - 'a=>4, b=>2'::hstore → "a"=>"1", "c"=>"3"
anyelement #= hstoreanyelementЗаменяет поля в левом операнде, имеющем составной тип, соответствующими значениями из hstoreROW(1,3) #= 'f1=>11'::hstore → (11,3)
%% hstoretext[]Преобразует hstore в массив перемежающихся ключей и значений%% 'a=>foo, b=>bar'::hstore → {a,foo,b,bar}
%# hstoretext[]Преобразует 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.

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право CREATE в текущей базе данных:

CREATE EXTENSION hstore SCHEMA ext;

Настройка

Не требуется.

Использование модуля

Добавление ключа или изменение значения для существующего ключа:

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: https://www.postgresql.org/docs/15/hstore.html.