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.