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Заменяет поля в левом операнде, имеющем составной тип, соответствующими значениями из hstoreROW(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.

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

  1. Добавление ключа или изменение значения для существующего ключа:
    UPDATE tab SET h = h || hstore('c', '3');
  2. Удаление ключа:
    UPDATE tab SET h = delete(h, 'k1');
  3. Приведение типа 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)
    
  4. Создание индекса GIN:
    CREATE INDEX hidx ON testhstore USING GIN (h);
  5. Индексы для сравнений с помощью =:
  • btree:
    CREATE INDEX hidx ON testhstore USING BTREE (h);
  • hash:
    CREATE INDEX hidx ON testhstore USING HASH (h);

Ссылки на документацию разработчика

Дополнительную информацию по поставляемому модулю hstore можно получить по ссылке.
Предыдущий раздел
fuzzystrmatch
Следующий раздел
hstore_plperl
Была ли страница полезной?