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 можно получить по ссылке.