×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

8.6.19. hstore — тип данных hstore для пар «ключ/значение»

8.6.19.1. hstore Внешнее представление
8.6.19.2. hstore Операторы и функции
8.6.19.3. Индексы
8.6.19.4. Примеры
8.6.19.5. Статистика
8.6.19.6. Совместимость
8.6.19.7. Трансформации
8.6.19.8. Авторы

Данный модуль реализует hstore тип данных для хранения наборов пар «ключ/значение» в одном Digital Q.DataBase поле. Это может быть полезно в различных сценариях, например, для строк с множеством редко используемых атрибутов или для слабоструктурированных данных. Ключи и значения являются обычными текстовыми строками.

Этот модуль считается «trusted»(доверенным), то есть он может быть установлен обычными пользователями, имеющими CREATE право в текущей базе данных.

8.6.19.1. hstore Внешнее представление #

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

k => v
foo => bar, baz => whatever
"1-a" => "anything at all"

Порядок следования пар не является значимым (и может не сохраняться при выводе данных). Пробелы между парами или вокруг символа => знак игнорируется. Ключи и значения, содержащие пробелы, запятые, =или >, необходимо заключать в двойные кавычки. Чтобы включить символ двойной кавычки или обратной косой черты в ключ или значение, его необходимо экранировать обратной косой чертой.

Каждый ключ в типе данных hstore уникален. Если тип данных hstore объявляется с дублирующимися ключами, то в hstore будет сохранено только одно из них, hstore и нет гарантии того, какое именно из них будет сохранено:

SELECT 'a=>1,a=>2'::hstore;
  hstore
----------
 "a"=>"1"

Значение (но не ключ) может принимать значение SQL NULL. Например:

key => NULL

Ключевое слово NULL нечувствительно к регистру. Заключите NULL в двойные кавычки, чтобы оно воспринималось как обычная строка «NULL».

Примечание

Учтите, что hstore текстовый формат при использовании для ввода применяется перед любым необходимым квотированием или экранированием. Если вы передаете hstore литерал через параметр, дополнительная обработка не требуется. Но если вы передаете его как литеральную константу в кавычках, то любые символы одиночной кавычки и (в зависимости от настройки standard_conforming_strings параметра конфигурации) символы обратной косой черты должны быть правильно экранированы. См. Раздел 2.1.1.2.1 для получения дополнительной информации об обработке строковых констант.

При выводе ключи и значения всегда заключаются в двойные кавычки, даже когда это не является строго необходимым.

8.6.19.2. hstore Операторы и функции #

Операторы, предоставляемые модулем тип данных hstore модуля приведены в Таблица 8.6.6, функции в Таблица 8.6.7.

Таблица 8.6.6. 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типов данных 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}}


Таблица 8.6.7. hstore Функции

Функция

Описание

Пример(ы)

тип данных hstore ( запись ) → тип данных hstore

Создаёт тип данных hstore на основе записи или строки.

hstore(ROW(1,2)) → "f1"=>"1", "f2"=>"2"

тип данных hstore ( text[] ) → тип данных hstore

Создаёт тип данных hstore из массива, который может быть либо массивом пар «ключ/значение», либо двумерным массивом.

hstore(ARRAY['a','1','b','2']) → "a"=>"1", "b"=>"2"

hstore(ARRAY[['c','3'],['d','4']]) → "c"=>"3", "d"=>"4"

тип данных hstore ( text[], text[] ) → тип данных hstore

Создаёт тип данных hstore из отдельных массивов ключей и значений.

hstore(ARRAY['a','b'], ARRAY['1','2']) → "a"=>"1", "b"=>"2"

тип данных hstore ( text, text ) → тип данных hstore

Создаёт тип данных hstore с одной парой «ключ/значение» hstore.

hstore('a', 'b') → "a"=>"b"

akeys ( hstore ) → text[]

Извлекает ключи hstoreтипа данных hstore в виде массива.

akeys('a=>1,b=>2') → {a,b}

skeys ( hstore ) → setof text

Извлекает ключи hstoreключи типа данных hstore в виде набора строк.

skeys('a=>1,b=>2') →

a
b

avals ( hstore ) → text[]

Извлекает ключи hstoreзначения типа данных hstore в виде массива.

avals('a=>1,b=>2') → {1,2}

svals ( hstore ) → setof text

Извлекает ключи hstoreзначения типа данных hstore в виде набора строк.

svals('a=>1,b=>2') →

1
2

hstore_to_array ( hstore ) → text[]

Извлекает ключи hstoreключи и значения типа данных hstore в виде массива чередующихся ключей и значений.

hstore_to_array('a=>1,b=>2') → {a,1,b,2}

hstore_to_matrix ( hstore ) → text[]

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

hstore_to_matrix('a=>1,b=>2') → {{a,1},{b,2}}

hstore_to_json ( hstore ) → json

Преобразует значение типа данных hstore в значение json типа данных JSON, преобразуя все значения, отличные от NULL, в строки JSON.

Эта функция используется неявно, когда значение hstore типа данных hstore приводится к типу данных JSON. json.

hstore_to_json('"a key"=>1, b=>t, c=>null, d=>12345, e=>012345, f=>1.234, g=>2.345e+4') → {"a key": "1", "b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4"}

hstore_to_jsonb ( hstore ) → jsonb

Преобразует значение типа данных hstore в значение jsonb типа данных JSON, преобразуя все значения, отличные от NULL, в строки JSON.

Эта функция используется неявно, когда значение hstore типа данных hstore приводится к типу данных JSON. jsonb.

hstore_to_jsonb('"a key"=>1, b=>t, c=>null, d=>12345, e=>012345, f=>1.234, g=>2.345e+4') → {"a key": "1", "b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4"}

hstore_to_json_loose ( hstore ) → json

Преобразует значение типа данных hstore в значение json значение, однако выполняется попытка отличить числовые и логические значения, чтобы они выводились без кавычек в типе данных JSON.

hstore_to_json_loose('"a key"=>1, b=>t, c=>null, d=>12345, e=>012345, f=>1.234, g=>2.345e+4') → {"a key": 1, "b": true, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 2.345e+4}

hstore_to_jsonb_loose ( hstore ) → jsonb

Преобразует значение типа данных hstore в значение jsonb значение, однако выполняется попытка отличить числовые и логические значения, чтобы они выводились без кавычек в типе данных JSON.

hstore_to_jsonb_loose('"a key"=>1, b=>t, c=>null, d=>12345, e=>012345, f=>1.234, g=>2.345e+4') → {"a key": 1, "b": true, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 2.345e+4}

slice ( hstore, text[] ) → тип данных hstore

извлекает подмножество из значения типа данных hstore, hstore содержащее только заданные ключи.

slice('a=>1,b=>2,c=>3'::hstore, ARRAY['b','c','x']) → "b"=>"2", "c"=>"3"

each ( hstore ) → setof record ( ключ text, значение text )

Извлекает ключи hstoreключи и значения hstore в виде набора записей.

select * from each('a=>1,b=>2') →

 ключ | значение
-----+-------
 a   | 1
 b   | 2

exist ( hstore, text ) → boolean

Содержит ли hstore ключ?

exist('a=>1', 'a') → t

defined ( hstore, text ) → boolean

Содержит ли hstore ненулевое NULL значение для ключа?

defined('a=>NULL', 'a') → f

delete ( hstore, text ) → тип данных hstore

Удаляет пару с указанным ключом.

delete('a=>1,b=>2', 'b') → "a"=>"1"

delete ( hstore, text[] ) → тип данных hstore

Удаляет пары с совпадающими ключами.

delete('a=>1,b=>2,c=>3', ARRAY['a','b']) → "c"=>"3"

delete ( hstore, hstore ) → тип данных hstore

Удаляет пары, соответствующие парам во втором аргументе.

delete('a=>1,b=>2', 'a=>4,b=>2'::hstore) → "a"=>"1"

populate_record ( anyelement, hstore ) → anyelement

Заменяет поля в левом операнде (который должен иметь составной тип данных) соответствующими значениями из hstore.

populate_record(ROW(1,2), 'f1=>42'::hstore) → (42,2)


Помимо этих операторов и функций, значения типа данных hstore hstore могут индексироваться, что позволяет им работать подобно ассоциативным массивам. Допускается использование только одного индекса типа text может быть указан; он интерпретируется как ключ, по которому извлекается или сохраняется соответствующее значение. Например:

CREATE TABLE mytable (h hstore);
INSERT INTO mytable VALUES ('a=>b, c=>d');
SELECT h['a'] FROM mytable;
 h
---
 b
(1 row)

UPDATE mytable SET h['c'] = 'new';
SELECT h FROM mytable;
          h
----------------------
 "a"=>"b", "c"=>"new"
(1 строка)

Операция выборки по индексу возвращает NULL если индекс имеет значение NULL или если этот ключ отсутствует в поле hstore. (Таким образом, выборка по индексу существенно не отличается от работы оператора -> .) Обновление по индексу завершается ошибкой, если индекс равен NULL; в противном случае операция заменяет значение для этого ключа, добавляя запись в поле hstore если ключ еще не существует.

8.6.19.3. Индексы #

hstore имеет поддержку индексов GiST и GIN для @>, ?, ?& и ?| операторов. Например:

CREATE INDEX hidx ON testhstore USING GIST (h);

CREATE INDEX hidx ON testhstore USING GIN (h);

gist_hstore_ops Класс операторов GiST аппроксимирует набор пар «ключ/значение» в виде битовой сигнатуры. Его необязательный целочисленный параметр siglen определяет длину сигнатуры в байтах. Длина по умолчанию составляет 16 байт. Допустимые значения длины сигнатуры — от 1 до 2024 байт. Более длинные сигнатуры обеспечивают более точный поиск (сканируется меньшая часть индекса и меньше страниц данных) ценой увеличения размера индекса.

Пример создания такого индекса с длиной сигнатуры 32 байта:

CREATE INDEX hidx ON testhstore USING GIST (h gist_hstore_ops(siglen=32));

hstore также поддерживает btree или hash индексы для = оператора. Это позволяет hstore объявляемых столбцов UNIQUE, либо использовать их в GROUP BY, ORDER BY или DISTINCT выражениях. Порядок сортировки для hstore значений не имеет особого смысла, однако такие индексы могут быть полезны для поиска по равенству. Создайте индексы для = сравнения следующим образом:

CREATE INDEX hidx ON testhstore USING BTREE (h);

CREATE INDEX hidx ON testhstore USING HASH (h);

8.6.19.4. Примеры #

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

UPDATE tab SET h['c'] = '3';

Того же результата можно достичь следующим способом:

UPDATE tab SET h = h || hstore('c', '3');

Если за одну операцию необходимо добавить или изменить несколько ключей, подход с использованием конкатенации будет эффективнее, чем обращение по индексу (субскрипту):

UPDATE tab SET h = h || hstore(array['q', 'w'], array['11', '12']);

Удаление ключа:

UPDATE tab SET h = delete(h, 'k1');

Преобразование запись в тип данных 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 строка)

Преобразование значения hstore в предопределенный запись тип:

CREATE TABLE test (col1 integer, col2 text, col3 text);

SELECT * FROM populate_record(null::test,
                              '"col1"=>"456", "col2"=>"zzz"');
 col1 | col2 | col3
------+------+------
  456 | zzz  |
(1 строка)

Изменение существующей записи с использованием значений из типа данных hstore:

CREATE TABLE test (col1 integer, col2 text, col3 text);
INSERT INTO test VALUES (123, 'foo', 'bar');

SELECT (r).* FROM (SELECT t #= '"col3"=>"baz"' AS r FROM test t) s;
 col1 | col2 | col3
------+------+------
  123 | foo  | baz
(1 строка)

8.6.19.5. Статистика #

Тип данных hstore hstore в силу своей внутренней гибкости может содержать множество различных ключей. Проверка корректности ключей возлагается на приложение. В следующих примерах демонстрируются различные методы проверки ключей и получения статистики.

Простой пример:

SELECT * FROM each('aaa=>bq, b=>NULL, ""=>1');

Использование таблицы:

CREATE TABLE stat AS SELECT (each(h)).key, (each(h)).value FROM testhstore;

Статистика в режиме реального времени:

SELECT key, count(*) FROM
  (SELECT (each(h)).key FROM testhstore) AS stat
  GROUP BY key
  ORDER BY count DESC, key;
    key    | count
-----------+-------
 line      |   883
 query     |   207
 pos       |   203
 node      |   202
 space     |   197
 status    |   195
 public    |   194
 title     |   190
 org       |   189
.................. .

8.6.19.6. Совместимость #

Начиная с версии PostgreSQL 9.0, hstore использует иное внутреннее представление, чем в предыдущих версиях. Это не создает препятствий для обновления путем выгрузки/восстановления (dump/restore), так как текстовое представление (используемое в дампе) осталось неизменным.

В случае бинарного обновления совместимость снизу вверх обеспечивается тем, что новый код распознает данные в старом формате. Это повлечет за собой небольшое снижение производительности при обработке данных, которые еще не были изменены новым кодом. Можно принудительно обновить все значения в столбце таблицы, выполнив инструкцию UPDATE следующим образом:

UPDATE tablename SET hstorecol = hstorecol || '';

Другой способ сделать это:

ALTER TABLE tablename ALTER hstorecol TYPE hstore USING hstorecol || '';

Команда ALTER TABLE требует наличия блокировки таблицы ACCESS EXCLUSIVE, но не приводит к раздуванию таблицы старыми версиями строк.

8.6.19.7. Трансформации #

Доступны дополнительные расширения, реализующие трансформации hstore для языков PL/Perl и PL/Python. Расширения для PL/Perl называются hstore_plperl и hstore_plperlu, для доверенной и недоверенной версий PL/Perl. Если вы установите эти расширения трансформации и укажете их при создании функции, hstore значения преобразуются в хеш-таблицы Perl. Расширение для PL/Python называется hstore_plpython3u. Если вы используете его, hstore значения преобразуются в словари Python.

Внимание

Настоятельно рекомендуется устанавливать расширения трансформации в ту же схему, что и тип данных hstore. В противном случае существуют риски безопасности на этапе установки, если схема расширения трансформации содержит объекты, созданные злоумышленником.

8.6.19.8. Авторы #

Олег Бартунов , Москва, МГУ, Россия

Федор Сигаев , Москва, Delta-Soft Ltd., Россия

Дополнительные улучшения: Эндрю Герт (Andrew Gierth) , Великобритания

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению