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.
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право 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.