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

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

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

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

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

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

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

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

2.6.16. Функции и операторы JSON

2.6.16.1. Обработка и создание данных JSON
2.6.16.2. Язык путей SQL/JSON (SQL/JSON Path)
2.6.16.3. Функции запросов SQL/JSON
2.6.16.4. JSON_TABLE

В данном разделе описываются:

  • функции и операторы для обработки и создания данных JSON

  • язык путей SQL/JSON

  • функции запросов SQL/JSON

Для обеспечения встроенной поддержки типов данных JSON в среде языка SQL, Digital Q.DataBase реализует модель данных SQL/JSON. Данная модель представляет собой последовательности элементов. Каждый элемент может содержать скалярные значения языка SQL, включая дополнительное значение SQL/JSON null, а также составные структуры данных, использующие массивы и объекты JSON. Данная модель является формализацией модели данных, неявно описанной в спецификации JSON RFC 7159.

Инструменты SQL/JSON позволяют обрабатывать данные в формате JSON совместно с обычными данными на языке SQL с поддержкой транзакций, включая:

  • загрузку данных JSON в базу данных и их хранение в обычных столбцах языка SQL в виде символьных или двоичных строк.

  • Формирование объектов и массивов JSON из реляционных данных.

  • Выполнение запросов к данным JSON с использованием функций запросов SQL/JSON и выражений языка путей SQL/JSON.

Для получения дополнительных сведений о стандарте SQL/JSON см. [sqltr-19075-6]. Подробные сведения о типах JSON, поддерживаемых в Digital Q.DataBase, см. Раздел 2.5.14.

2.6.16.1. Обработка и создание данных JSON #

Таблица 2.6.45 приведены операторы, доступные для использования с типами данных JSON (см. Раздел 2.5.14). Кроме того, обычные операторы сравнения, указанные в Таблица 2.6.1 доступны для типа jsonb, но не для типа json. Операторы сравнения следуют правилам упорядочивания для операций B-дерева, описанным в Раздел 2.5.14.4. См. также Раздел 2.6.21 описание агрегатной функции json_agg которая агрегирует значения записей в формате JSON, агрегатной функции json_object_agg которая объединяет пары значений в объект JSON, и их jsonb эквивалентов, jsonb_agg и jsonb_object_agg.

Таблица 2.6.45. json и jsonb Операторы

Оператор

Описание

Примеры

json -> integerjson

jsonb -> integerjsonb

Извлекает nn-й элемент массива JSON (элементы массива индексируются с нуля, при этом отрицательные значения позволяют вести отсчет с конца массива).

'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json -> 2{"c":"baz"}

'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json -> -3{"a":"foo"}

json -> textjson

jsonb -> textjsonb

Извлекает поле JSON-объекта по заданному ключу.

'{"a": {"b":"foo"}}'::json -> 'a'{"b":"foo"}

json ->> integertext

jsonb ->> integertext

Извлекает nn-й элемент JSON-массива, функции text.

'[1,2,3]'::json ->> 23

json ->> texttext

jsonb ->> texttext

Извлекает поле JSON-объекта по заданному ключу в виде текстовой строки, text.

'{"a":1,"b":2}'::json ->> 'b'2

json #> text[]json

jsonb #> text[]jsonb

Извлекает вложенный JSON-объект по указанному пути, в котором элементами пути могут выступать ключи полей или индексы массива.

'{"a": {"b": ["foo","bar"]}}'::json #> '{a,b,1}'"bar"

json #>> text[]text

jsonb #>> text[]text

Данный оператор извлекает вложенный объект JSON по указанному пути как text.

'{"a": {"b": ["foo","bar"]}}'::json #>> '{a,b,1}'bar


Примечание

Операторы извлечения поля, элемента или пути возвращают значение NULL вместо генерации ошибки, если входные данные JSON не имеют структуры, соответствующей условиям запроса; например, если указанный ключ или элемент массива отсутствует.

Существуют также дополнительные операторы, предназначенные только для jsonb, как показано в Таблица 2.6.46. Раздел 2.5.14.4 описывает способы применения данных операторов для обеспечения эффективного поиска в индексированных jsonb данных.

Таблица 2.6.46. Дополнительные jsonb Операторы

Оператор

Описание

Примеры

jsonb @> jsonbboolean

Содержит ли первое значение JSON в себе второе значение? (См. Раздел 2.5.14.3 подробные сведения о проверке на включение приведены далее.)

'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonbt

jsonb <@ jsonbboolean

Входит ли первое значение JSON в состав второго значения?

'{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonbt

jsonb ? textboolean

Присутствует ли текстовая строка в качестве ключа верхнего уровня или элемента массива внутри значение JSON?

'{"a":1, "b":2}'::jsonb ? 'b't

'["a", "b", "c"]'::jsonb ? 'b't

jsonb ?| text[]boolean

Присутствует ли любая из строк текстового массива в качестве ключа верхнего уровня или элемента массива?

'{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'd']t

jsonb ?& text[]boolean

Присутствуют ли все строки текстового массива в качестве ключей верхнего уровня или элемента массива?

'["a", "b", "c"]'::jsonb ?& array['a', 'b']t

jsonb || jsonbjsonb

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

'["a", "b"]'::jsonb || '["a", "d"]'::jsonb["a", "b", "a", "d"]

'{"a": "b"}'::jsonb || '{"c": "d"}'::jsonb{"a": "b", "c": "d"}

'[1, 2]'::jsonb || '3'::jsonb[1, 2, 3]

'{"a": "b"}'::jsonb || '42'::jsonb[{"a": "b"}, 42]

Чтобы добавить массив в другой массив в качестве одного элемента, его необходимо обернуть в дополнительный массив, например:

'[1, 2]'::jsonb || jsonb_build_array('[3, 4]'::jsonb)[1, 2, [3, 4]]

jsonb - textjsonb

Удаляет ключ (и соответствующее ему значение) из объекта JSON или совпадающие строковые значения из массива JSON.

'{"a": "b", "c": "d"}'::jsonb - 'a'{"c": "d"}

'["a", "b", "c", "b"]'::jsonb - 'b'["a", "c"]

jsonb - text[]jsonb

Операция удаляет из левого операнда все соответствующие ключи или элементы массива.

'{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[]{}

jsonb - integerjsonb

Удаляет элемент массива с указанным индексом (отрицательные целые числа отсчитываются от конца). Если значение JSON не является массивом, возникает ошибка.

'["a", "b"]'::jsonb - 1 ["a"]

jsonb #- text[]jsonb

Удаляет поле или элемент массива по заданному пути, элементами которого могут быть ключи полей или индексы массива.

'["a", {"b":1}]'::jsonb #- '{1,b}'["a", {}]

jsonb @? jsonpathboolean

Возвращает ли путь JSON какой-либо элемент для указанного значения JSON? (Это применимо только к выражениям JSON path в стандарте SQL, но не к выражениям проверки предикатов, так как последние всегда возвращают значение.)

'{"a":[1,2,3,4,5]}'::jsonb @? '$.a[*] ? (@ > 2)'t

jsonb @@ jsonpathboolean

Функция возвращает результат проверки предиката JSON path для указанного значения JSON. (Это применимо только к с выражениям проверки предикатов, а не к выражениям JSON path в стандарте SQL, поскольку результат будет возвращен только в том случае, NULL если результатом пути является одиночное логическое значение.)

'{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2't


Примечание

Данный jsonpath операторы @? и @@ подавляют следующие ошибки: отсутствие поля объекта или элемента массива, неверный тип элемента JSON, а также ошибки при обработке дат и чисел. jsonpathВ связанных функциях, описанных ниже, также можно настроить подавление ошибок данных типов. Данное поведение может быть полезным при поиске в коллекциях JSON-документов с различной структурой.

Таблица 2.6.47 содержит описание функций, доступных для формирования json и jsonb значений. Для некоторых функций в данной таблице предусмотрено RETURNING предложение, определяющее тип возвращаемых данных. В качестве такого типа должен быть указан тип json, jsonb, bytea, строковый символьный тип (text, char, или varchar) либо тип, поддерживающий приведение к типу json. По умолчанию возвращается значение типа json type is returned.

Таблица 2.6.47. Функции создания JSON

Функция

Описание

Примеры

to_json ( anyelement ) → json

to_jsonb ( anyelement ) → jsonb

Преобразует любое значение языка SQL в значение типа json или jsonb. Массивы и составные типы рекурсивно преобразуются в массивы и объекты (многомерные массивы преобразуются в массивы массивов в формате JSON). В противном случае, если определено приведение из типа данных языка SQL в json, для выполнения данного преобразования будет использована функция приведения типов;[a] в противном случае формируется скалярное значение JSON. Для любого скалярного значения, отличного от числа, логического значения или значения NULL, используется текстовое представление с применением необходимого экранирования для обеспечения соответствия формату строки JSON.

to_json('Fred said "Hi."'::text)"Fred said \"Hi.\""

to_jsonb(row(42, 'Fred said "Hi."'::text)){"f1": 42, "f2": "Fred said \"Hi.\""}

array_to_json ( anyarray [, boolean ] ) → json

Данная функция преобразует массив языка SQL в массив JSON. Поведение функции идентично, функции to_json за исключением того, что добавляются символы перевода строки между элементами массива верхнего уровня, если необязательный логический параметр принимает значение true.

array_to_json('{{1,5},{99,100}}'::int[])[[1,5],[99,100]]

json_array ( [ { value_expression [ FORMAT JSON ] } [, ...] ] [ { NULL | ABSENT } ON NULL ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ])

json_array ( [ query_expression ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ])

Данная функция формирует массив JSON либо из набора value_expression параметров, либо на основе результатов из query_expression, подзапроса, который должен представлять собой запрос SELECT языка SQL, возвращающий один столбец. Если ABSENT ON NULL указано данное выражение, значения NULL игнорируются. Это условие всегда соблюдается, если query_expression используется.

json_array(1,true,json '{"a":null}')[1, true, {"a":null}]

json_array(SELECT * FROM (VALUES(1),(2)) t)[1, 2]

row_to_json ( record [, boolean ] ) → json

Преобразует составное значение языка SQL в объект JSON. Такое поведение аналогично выражению to_json за исключением того, что символы перевода строки будут добавлены между элементами верхнего уровня, если необязательный логический параметр принимает значение true.

row_to_json(row(1,'foo')){"f1":1,"f2":"foo"}

json_build_array ( VARIADIC "any" ) → json

jsonb_build_array ( VARIADIC "any" ) → jsonb

Формирует JSON-массив, потенциально содержащий данные различных типов, из вариативного списка аргументов. Каждый аргумент преобразуется согласно правилам функции to_json или to_jsonb.

json_build_array(1, 2, 'foo', 4, 5)[1, 2, "foo", 4, 5]

json_build_object ( VARIADIC "any" ) → json

jsonb_build_object ( VARIADIC "any" ) → jsonb

Формирует JSON-объект из вариативного списка аргументов. Согласно соглашению, список аргументов состоит из чередующихся ключей и значений. Аргументы, являющиеся ключами, приводятся к типу text; аргументы, являющиеся значениями, преобразуются согласно правилам функции to_json или to_jsonb.

json_build_object('foo', 1, 2, row(3,'bar')){"foo" : 1, "2" : {"f1":3,"f2":"bar"}}

json_object ( [ { key_expression { VALUE | ':' } value_expression [ FORMAT JSON [ ENCODING UTF8 ] ] }[, ...] ] [ { NULL | ABSENT } ON NULL ] [ { WITH | WITHOUT } UNIQUE [ KEYS ] ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ])

Формирует объект JSON из всех заданных пар «ключ-значение» или пустой объект, если пары не указаны. key_expression представляет собой скалярное выражение, определяющее JSON ключ, который преобразуется в тип text text. Он не может иметь значение NULL, NULL а также не может относиться к типу, для которого определено приведение к типу json text. Если WITH UNIQUE KEYS указано, не допускается наличие дублирующихся key_expression. Любая пара, для которой выражение value_expression вычисляется как NULL исключается из выходного результата если ABSENT ON NULL указано; если NULL ON NULL указано или если необязательное предложение пропущено, то ключ включается со значением NULL.

json_object('code' VALUE 'P123', 'title': 'Jaws'){"code" : "P123", "title" : "Jaws"}

json_object ( text[] ) → json

jsonb_object ( text[] ) → jsonb

Данная функция формирует объект JSON из текстового массива. Массив должен иметь либо ровно одну размерность с четным числом элементов, в этом случае они интерпретируются как чередующиеся пары «ключ-значение», либо две размерности такие, что каждый внутренний массив содержит ровно два элемента, которые интерпретируются как пара «ключ-значение». Все значения преобразуются в строковые значения JSON.

json_object('{a, 1, b, "def", c, 3.5}'){"a" : "1", "b" : "def", "c" : "3.5"}

json_object('{{a, 1}, {b, "def"}, {c, 3.5}}'){"a" : "1", "b" : "def", "c" : "3.5"}

json_object ( ключи text[], значения text[] ) → json

jsonb_object ( ключи text[], значения text[] ) → jsonb

Данная форма json_object принимает ключи и значения попарно из отдельных массивов текста. В остальном она идентична форме с одним аргументом.

json_object('{a,b}', '{1,2}'){"a": "1", "b": "2"}

json ( выражение [ FORMAT JSON [ ENCODING UTF8 ]] [ { WITH | WITHOUT } UNIQUE [ KEYS ]] ) → json

Преобразует заданное выражение, представленное как text или bytea строка (в кодировке UTF8), в значение типа JSON значение. Если выражение оператор IS NULL возвращает истину, то SQL возвращается значение NULL. Если WITH UNIQUE указано, то выражение не должен содержать дублирующиеся ключи объектов.

json('{"a":123, "b":[true,"foo"], "a":"bar"}'){"a":123, "b":[true,"foo"], "a":"bar"}

json_scalar ( выражение )

Функция преобразует заданное скалярное значение языка SQL в скалярное значение JSON. Если входное значение имеет значение NULL, то SQL возвращается значение null. Если входное значение представляет собой число или логическое значение, то соответствующее число или логическое значение JSON возвращается. Для любого другого типа данных возвращается строка JSON.

json_scalar(123.45)123.45

json_scalar(CURRENT_TIMESTAMP)"2022-05-10T10:51:04.62128-04:00"

json_serialize ( выражение [ FORMAT JSON [ ENCODING UTF8 ] ] [ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ] )

Данная функция преобразует выражение языка SQL/JSON в символьную или двоичную строку. выражение могут иметь любой тип JSON, любой строковый тип данных или bytea в кодировке UTF8. Возвращаемым типом данных, используемым в конструкции RETURNING может быть любой символьный строковый тип или bytea. Значением по умолчанию является text.

json_serialize('{ "a" : 1 } ' RETURNING bytea)\x7b20226122203a2031207d20

[a] Например, расширение hstore hstore содержит приведение типов из hstore до json, вследствие чего hstore значения, преобразованные при помощи функций формирования JSON, будут представлены как объекты JSON, а не как примитивные строковые значения.


Таблица 2.6.48 подробно описывает средства языка SQL/JSON для тестирования данных JSON.

Таблица 2.6.48. Функции проверки SQL/JSON

Сигнатура функции

Описание

Пример(ы)

выражение IS [ NOT ] JSON [ { VALUE | SCALAR | ARRAY | OBJECT } ] [ { WITH | WITHOUT } UNIQUE [ KEYS ] ]

Данный предикат проверяет, может ли выражение быть выражение могут быть интерпретировано как JSON, при необходимости — заданного типа. Если SCALAR или ARRAY или OBJECT указано, то проверяется соответствие JSON указанному типу. Если WITH UNIQUE KEYS указано, то любой объект в выражение также проверяется на наличие дублирующихся ключей.

SELECT js,
  js IS JSON "json?",
  js IS JSON SCALAR "scalar?",
  js IS JSON OBJECT "object?",
  js IS JSON ARRAY "array?"
FROM (VALUES
      ('123'), ('"abc"'), ('{"a": "b"}'), ('[1,2]'),('abc')) foo(js);
     js     | json? | scalar? | object? | array?
------------+-------+---------+---------+--------
 123        | t     | t       | f       | f
 "abc"      | t     | t       | f       | f
 {"a": "b"} | t     | f       | t       | f
 [1,2]      | t     | f       | f       | t
 abc        | f     | f       | f       | f

SELECT js,
  js IS JSON OBJECT "object?",
  js IS JSON ARRAY "array?",
  js IS JSON ARRAY WITH UNIQUE KEYS "array w. UK?",
  js IS JSON ARRAY WITHOUT UNIQUE KEYS "array w/o UK?"
FROM (VALUES ('[{"a":"1"},
 {"b":"2","b":"3"}]')) foo(js);
-[ RECORD 1 ]-+--------------------
js            | [{"a":"1"},        +
              |  {"b":"2","b":"3"}]
object?       | f
array?        | t
array w. UK?  | f
array w/o UK? | t


Таблица 2.6.49 представлены функции, доступные для обработки json и jsonb значений.

Таблица 2.6.49. Функции для обработки данных JSON

Функция

Описание

Примеры

json_array_elements ( json ) → setof json

jsonb_array_elements ( jsonb ) → setof jsonb

Функция разворачивает JSON-массив верхнего уровня в набор JSON-значений.

select * from json_array_elements('[1,true, [2,false]]')

   value
-----------
 1
 true
 [2,false]

json_array_elements_text ( json ) → setof text

jsonb_array_elements_text ( jsonb ) → setof text

Функция разворачивает JSON-массив верхнего уровня в набор text значений.

select * from json_array_elements_text('["foo", "bar"]')

   value
-----------
 foo
 bar

json_array_length ( json ) → integer

jsonb_array_length ( jsonb ) → integer

Функция возвращает количество элементов в JSON-массиве верхнего уровня.

json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]')5

jsonb_array_length('[]')0

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

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

Данная функция разворачивает JSON-объект верхнего уровня в набор пар «ключ/значение».

select * from json_each('{"a":"foo", "b":"bar"}')

 key | value
-----+-------
 a   | "foo"
 b   | "bar"

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

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

Данная функция разворачивает JSON-объект верхнего уровня в набор пар «ключ/значение». Возвращаемые значениеы будут иметь тип text.

select * from json_each_text('{"a":"foo", "b":"bar"}')

 key | value
-----+-------
 a   | foo
 b   | bar

json_extract_path ( from_json json, VARIADIC path_elems text[] ) → json

jsonb_extract_path ( from_json jsonb, VARIADIC path_elems text[] ) → jsonb

Функция извлекает вложенный JSON-объект по указанному пути. (Данная операция функционально эквивалентна #> оператору, однако в некоторых случаях может быть удобнее записывать путь в виде списка аргументов переменной длины (variadic list).)

json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', 'f4', 'f6')"foo"

json_extract_path_text ( from_json json, VARIADIC path_elems text[] ) → text

jsonb_extract_path_text ( from_json jsonb, VARIADIC path_elems text[] ) → text

Данный оператор извлекает вложенный объект JSON по указанному пути как text. (Данная операция функционально эквивалентна #>> оператор.)

json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', 'f4', 'f6')foo

json_object_keys ( json ) → setof text

jsonb_object_keys ( jsonb ) → setof text

Функция возвращает набор ключей объекта JSON верхнего уровня.

select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}')

 json_object_keys
------------------
 f1
 f2

json_populate_record ( base anyelement, from_json json ) → anyelement

jsonb_populate_record ( base anyelement, from_json jsonb ) → anyelement

Функция разворачивает объект JSON верхнего уровня в строку, имеющую составной тип из base аргумента. В объекте JSON выполняется поиск полей, имена которых совпадают с именами столбцов результирующей строки типа, после чего их значения вставляются в соответствующие столбцы результата. (Поля, не соответствующие именам выходных столбцов, игнорируются.) При обычном использовании значением base является просто NULL, что означает следующее: любые выходные столбцы, которые не совпадают с полями объекта, будут заполнены значениями NULL. Однако если base не является NULL то содержащиеся в нем значения будут использованы для несовпадающих столбцов.

Для преобразования значения JSON в тип языка SQL выходного столбца последовательно применяются следующие правила:

  • Значение JSON null во всех случаях преобразуется в значение NULL языка SQL.

  • Если выходной столбец имеет тип json или jsonb, значение JSON просто воспроизводится в исходном виде.

  • Если выходной столбец имеет составной тип (тип строки), а значение JSON представляет собой объект JSON, то поля этого объекта преобразуются в столбцы выходного типа строки путем рекурсивного применения данных правил.

  • Аналогично, если выходной столбец является типом массива, а значение JSON представляет собой массив JSON, то элементы этого массива преобразуются в элементы выходного массива путем рекурсивного применения данных правил.

  • В противном случае, если значение JSON является строкой, содержимое этой строки передается функции входного преобразования для типа данных соответствующего столбца.

  • В противном случае используется обычное текстовое представление значения JSON передаются функции преобразования входных данных, соответствующей типу данных столбца.

Хотя в приведенном ниже примере используется константное значение JSON, в типичных сценариях использования предполагается ссылка на json или jsonb столбец, получаемый латерально из другой таблицы в FROM фразе запроса. Использование json_populate_record в с FROM данной фразы является хорошей практикой, так как все извлеченные столбцы становятся доступны для использования без повторных вызовов функций.

create type subrowtype as (d int, e text); create type myrowtype as (a int, b text[], c subrowtype);

select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}, "x": "foo"}')

 a |   b       |      c
---+-----------+-------------
 1 | {2,"a b"} | (4,"a b c")

jsonb_populate_record_valid ( base anyelement, from_json json ) → boolean

Функция для тестирования jsonb_populate_record. Возвращает логическое значение true если входные данные jsonb_populate_record выполнение функции завершится без ошибки для заданного входного объекта JSON; то есть, если это допустимые входные данные, false в противном случае.

create type jsb_char2 as (a char(2));

select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aaa"}');

 jsonb_populate_record_valid
-----------------------------
 f
(1 строка)

select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aaa"}') q;

ERROR:  value too long for type character(2)

select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aa"}');

 jsonb_populate_record_valid
-----------------------------
 t
(1 row)

select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aa"}') q;

 a
----
 aa
(1 row)

json_populate_recordset ( base anyelement, from_json json ) → setof anyelement

jsonb_populate_recordset ( base anyelement, from_json jsonb ) → setof anyelement

Функция разворачивает массив объектов JSON верхнего уровня в набор строк, имеющих составной тип данных base аргумент. Каждый элемент массива JSON обрабатывается способом, описанным выше в json[b]_populate_record.

create type twoints as (a int, b int);

select * from json_populate_recordset(null::twoints, '[{"a":1,"b":2}, {"a":3,"b":4}]')

 a | b
---+---
 1 | 2
 3 | 4

json_to_record ( json ) → record

jsonb_to_record ( jsonb ) → record

Функция разворачивает объект JSON верхнего уровня в строку, имеющую составной тип определяемый с помощью AS предложения. (Как и для всех функций, возвращающих тип record, вызывающий запрос должен явно определять структуру записи с использованием AS предложения.) Выходная запись заполняется из полей объекта JSON тем же способом, который был описан выше в json[b]_populate_record. Поскольку входное значение записи отсутствует, несовпадающие столбцы всегда заполняются значениями NULL.

create type myrowtype as (a int, b text);

select * from json_to_record('{"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": {"a": 123, "b": "a b c"}}') as x(a int, b text, c int[], d text, r myrowtype)

 a |    b    |    c    | d |       r
---+---------+---------+---+---------------
 1 | [1,2,3] | {1,2,3} |   | (123,"a b c")

json_to_recordset ( json ) → setof record

jsonb_to_recordset ( jsonb ) → setof record

Функция разворачивает массив объектов JSON верхнего уровня в набор строк, имеющих составной тип, определяемый AS фразой. (Как и для всех функций, возвращающих тип record, вызывающий запрос должен явно определять структуру записи с помощью фразы символ ASCII. AS .) Каждый элемент массива JSON обрабатывается согласно описанному выше алгоритму в json[b]_populate_record.

select * from json_to_recordset('[{"a":1,"b":"foo"}, {"a":"2","c":"bar"}]') as x(a int, b text)

 a |  b
---+-----
 1 | foo
 2 |

jsonb_set ( целевой запрос jsonb, path text[], new_value jsonb [, create_if_missing boolean ] ) → jsonb

Возвращает значение целевой запрос элементом, указанным в пути path заменены на new_value, либо с элементом, new_value добавленным в случае, если параметр create_if_missing имеет значение true (которое используется по умолчанию), а элемент, указанный в пути path , не существует. Все предыдущие элементы в пути должны существовать, иначе с целевой запрос возвращается в исходном виде. По аналогии с операторами для работы с путями, отрицательные целые числа, которые указаны в path отсчитываются от конца массивов JSON. Если последний шаг пути является индексом массива, выходящим за границы диапазона, и create_if_missing имеет значение true, новое значение добавляется в начало массива, если индекс отрицателен, и в конец массива, если индекс положителен.

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false)[{"f1": [2, 3, 4], "f2": null}, 2, null, 3]

jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}', '[2,3,4]')[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

jsonb_set_lax ( целевой запрос jsonb, path text[], new_value jsonb [, create_if_missing boolean [, null_value_treatment text ]] ) → jsonb

Если new_value не является NULL, функционирует аналогично jsonb_set. В противном случае функция работает в соответствии со значением из null_value_treatment которое должно принимать одно из значений из 'raise_exception', 'use_json_null', 'delete_key'или 'return_target'. Значением по умолчанию является 'use_json_null'.

jsonb_set_lax('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', null)[{"f1": null, "f2": null}, 2, null, 3]

jsonb_set_lax('[{"f1":99,"f2":null},2]', '{0,f3}', null, true, 'return_target')[{"f1": 99, "f2": null}, 2]

jsonb_insert ( целевой запрос jsonb, path text[], new_value jsonb [, insert_after boolean ] ) → jsonb

Возвращает значение целевой запрос с new_value вставляется. Если элемент, указанный в path является элементом массива элемент, new_value будет вставлен перед этим элементом, если insert_after имеет значение false (которое используется по умолчанию), либо после него если insert_after имеет значение true. Если элемент указанный в path является объектом, поле new_value будет вставлено только в том случае, если данный объект еще не содержит этот ключ. Все предыдущие элементы в пути должны существовать, иначе с целевой запрос возвращается в исходном виде. По аналогии с операторами для работы с путями, отрицательные целые числа, которые указаны в path отсчитываются от конца массивов JSON. Если последним шагом в пути является индекс массива, выходящий за пределы диапазона, то новый элемент значение добавляется в начало массива, если индекс отрицателен, и в конец массива, если индекс положителен.

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'){"a": [0, "new_value", 1, 2]}

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true){"a": [0, 1, "new_value", 2]}

json_strip_nulls ( json ) → json

jsonb_strip_nulls ( jsonb ) → jsonb

Рекурсивно удаляет из заданного JSON-значения все поля объектов, имеющие значение null. Значения null, не являющиеся полями объектов, остаются без изменений.

json_strip_nulls('[{"f1":1, "f2":null}, 2, null, 3]')[{"f1":1},2,null,3]

jsonb_path_exists ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

Проверяет, возвращает ли путь JSON какие-либо элементы для указанного значения JSON. значение. (Это применимо только к выражениям JSON path в стандарте SQL, но не к выражениям проверки предикатов, так как последние всегда возвращают значение.) Если указан vars аргумент, он должен быть объектом JSON, поля которого содержат именованные значения для подстановки в jsonpath выражение. Если указан silent аргумент указан и соответствует true, функция подавляет те же ошибки, что и @? и @@ операторы.

jsonb_path_exists('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}')t

jsonb_path_match ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

Возвращает логический результат языка SQL при проверке предиката пути JSON для указанного значения JSON. (Это применимо только к с выражениям проверки предикатов, а не к выражениям JSON path в стандарте SQL, так как это приведет либо к ошибке, либо к возврату NULL если результат пути не является одиночным логическим значением.) Необязательные vars и silent аргументы функционируют аналогично параметрам функции в jsonb_path_exists.

jsonb_path_match('{"a":[1,2,3,4,5]}', 'exists($.a[*] ? (@ >= $min && @ <= $max))', '{"min":2, "max":4}')t

jsonb_path_query ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → setof jsonb

Функция возвращает все элементы JSON, полученные в результате применения пути JSON к указанному значению JSON. Для выражений пути JSON стандарта языка SQL функция возвращает значения JSON, выбранные из целевой запрос. Для выражениям проверки предикатов она возвращает результат выполнения предиката проверка: true, false, или null. Необязательные vars и silent аргументы функционируют аналогично параметрам функции в jsonb_path_exists.

select * from jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}')

 jsonb_path_query
------------------
 2
 3
 4

jsonb_path_query_array ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Функция возвращает все элементы JSON, полученные в результате применения пути JSON к указанному значение JSON, представленное в виде массива JSON. Данные параметры идентичны параметрам функции в jsonb_path_query.

jsonb_path_query_array('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}')[2, 3, 4]

jsonb_path_query_first ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Функция возвращает первый элемент JSON, полученный в результате выполнения пути JSON для заданного значения JSON, или значение `NULL`, NULL если какие-либо результаты отсутствуют. Данные параметры идентичны параметрам функции в jsonb_path_query.

jsonb_path_query_first('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}')2

jsonb_path_exists_tz ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

jsonb_path_match_tz ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

jsonb_path_query_tz ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → setof jsonb

jsonb_path_query_array_tz ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

jsonb_path_query_first_tz ( целевой запрос jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Данные функции работают аналогично функциям-аналогам, описанным выше без с _tz суффикса, за исключением того, что эти функции поддерживают сравнение значений даты и времени, требующее выполнения преобразований с учётом часового пояса. Приведённый ниже пример требует интерпретации значения, содержащего только дату, 2015-08-02 как типа timestamp с часовым поясом, вследствие чего результат зависит от текущей настройки TimeZone. TimeZone настройки. Вследствие данной зависимости данные функции помечаются как стабильные (stable), что исключает их использование в индексах. Аналогичные им функции являются неизменяемыми (immutable) и могут быть использованы в индексах; однако при попытке выполнения таких сравнений возникнут ошибки.

jsonb_path_exists_tz('["2015-08-01 12:00:00-05"]', '$[*] ? (@.datetime() < "2015-08-02".datetime())')t

jsonb_pretty ( jsonb ) → text

Преобразует заданное значение JSON в текст с отступами для удобства чтения.

jsonb_pretty('[{"f1":1,"f2":null}, 2]')

[
    {
        "f1": 1,
        "f2": null
    },
    2
]

json_typeof ( json ) → text

jsonb_typeof ( jsonb ) → text

Возвращает тип значения JSON верхнего уровня в виде текстовой строки. Допустимые типы: object, array, строка, количество, boolean, и null. (Полученный null результат не следует путать с NULL-значением в языке SQL; см. примеры.)

json_typeof('-123.4')количество

json_typeof('null'::json)null

json_typeof(NULL::json) IS NULLt


2.6.16.2. Язык путей SQL/JSON (SQL/JSON Path) #

Выражения путей SQL/JSON определяют элементы, извлекаемые из значений JSON, аналогично выражениям XPath, используемым для доступа к содержимому документов XML. В Digital Q.DataBase, выражения путей реализованы как тип данных jsonpath и могут использовать любые элементы, описанные в Раздел 2.5.14.7.

Функции и операторы запросов JSON передают предоставленное выражение пути в механизм обработки путей для вычисления. Если выражение соответствует запрашиваемым данным JSON, возвращается соответствующий элемент JSON или набор элементов. Если совпадение не найдено, результатом будет NULL, false, или ошибка, в зависимости от конкретной функции. Выражения путей пишутся на языке путей SQL/JSON и могут включать в себя арифметические выражения и функции.

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

Для обращения к запрашиваемому значению JSON (так называемый элемент контекста), используйте $ переменную в выражении пути. Первым элементом пути всегда должен быть $. За ним могут следовать один или несколько операторов доступа, которые выполняют переход по структуре JSON уровень за уровнем для извлечения подэлементов элемента контекста. Каждый оператор доступа обрабатывает результаты предыдущего этапа вычисления, формируя ноль, один или несколько выходных элементов на основе каждого входного элемента.

Например, предположим, что имеются данные JSON от GPS-трекера, которые необходимо проанализировать, такие как:

SELECT '{
  "track": {
    "segments": [
      {
        "location":   [ 47.763, 13.4034 ],
        "start time": "2018-10-14 10:05:14",
        "HR": 73
      },
      {
        "location":   [ 47.706, 13.2635 ],
        "start time": "2018-10-14 10:39:21",
        "HR": 135
      }
    ]
  }
}' AS json \gset

(Приведенный выше пример можно скопировать и вставить в psql для подготовки данных к последующим примерам. После этого команда psql будет выполнено развертывание :'json' в строковую константу с корректным использованием кавычек, содержащую значение JSON.)

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

=> select jsonb_path_query(:'json', '$.track.segments');
                                                                         jsonb_path_query
-----------------------------------------------------------​ -----------------------------------------------------------​ ---------------------------------------------
 [{"HR": 73, "location": [47.763, 13.4034], "start time": "2018-10-14 10:05:14"}, {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}]

Для получения содержимого массива обычно используется [*] оператор. Следующий пример возвращает координаты местоположения для всех доступных сегментов трека:

=> select jsonb_path_query(:'json', '$.track.segments[*].location');
 jsonb_path_query
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]

В данном случае обработка начинается со всего входного значения JSON ($), затем .track аксессор выбирает объект JSON, связанный с ключом "track" ключ объекта, после чего .segments аксессор выбирает массив JSON, соответствующий ключу "segments" внутри этого объекта, далее [*] оператор доступа выбрал каждый элемент данного массива (формируя последовательность элементов), а затем .location аксессор выбирает массив JSON, соответствующий ключу "location" ключ внутри каждого из этих объектов. В данном примере каждый из этих объектов содержал ключ "location" key; но если какой-либо из них не содержал данных, то .location оператор доступа просто не сформировал бы результат для данного входного элемента.

Для получения координат только первого сегмента можно указать соответствующий индекс в [] операторе доступа. Следует помнить, что индексация в массивах JSON начинается с нуля:

=> select jsonb_path_query(:'json', '$.track.segments[0].location');
 jsonb_path_query
-------------------
 [47.763, 13.4034]

Результат каждого шага вычисления пути может быть обработан одним или несколькими jsonpath операторами и методами, перечисленными в Раздел 2.6.16.2.3. Перед именем каждого метода должна стоять точка. Например, размер массива можно получить следующим образом:

=> select jsonb_path_query(:'json', '$.track.segments.size()');
 jsonb_path_query
------------------
 2

Дополнительные примеры использования jsonpath операторов и методов в выражениях путей приведены далее в Раздел 2.6.16.2.3.

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

? (условие)

Выражения фильтра должны указываться непосредственно после того этапа вычисления пути, к которому они применяются. Результат этого этапа фильтруется для включения только тех элементов, которые удовлетворяют заданному условию. Стандарт SQL/JSON определяет трехзначную логику, поэтому условие может принимать значения true, false, или unknown. The unknown значение играет ту же роль, что и в языке SQL NULL и может быть проверено с помощью is unknown предиката. На последующих этапах вычисления пути используются только те элементы, для которых выражение фильтра вернуло значение true.

Функции и операторы, которые могут применяться в выражениях фильтра, перечислены в Таблица 2.6.51. Внутри выражения фильтра переменная @ обозначает текущее обрабатываемое значение (то есть один из результатов предшествующего этапа пути). Операторы доступа могут быть указаны после переменной @ для извлечения составных частей элементов.

Предположим, например, что требуется получить все значения частоты пульса, превышающие 130. Сделать это можно следующим образом:

=> select jsonb_path_query(:'json', '$.track.segments[*].HR ? (@ > 130)');
 jsonb_path_query
------------------
 135

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

=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.HR > 130)."start time"');
   jsonb_path_query
-----------------------
 "2018-10-14 10:39:21"

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

=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"');
   jsonb_path_query
-----------------------
 "2018-10-14 10:39:21"

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

=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)');
 jsonb_path_query
------------------
 135

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

=> select jsonb_path_query(:'json', '$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()');
 jsonb_path_query
------------------
 2

2.6.16.2.1. Отклонения от стандарта SQL #

Digital Q.DataBaseРеализация языка путей SQL/JSON имеет следующие отклонения от стандарта SQL/JSON.

2.6.16.2.1.1. Выражения проверки логических предикатов #

В качестве расширения стандарта SQL Digital Q.DataBase путь может представлять собой логический предикат, тогда как стандарт SQL допускает использование предикатов только внутри фильтров. В то время как списочные выражения в стандарте SQL возвращают соответствующие элементы запрашиваемого значения JSON, выражения проверки предикатов возвращают единственное трехзначное значение — jsonb результат вычисления предиката: true, false, или null. Например, можно составить следующее выражение фильтра согласно стандарту SQL:

=> select jsonb_path_query(:'json', '$.track.segments ?(@[*].HR > 130)');
                                jsonb_path_query
-----------------------------------------------------------​ ----------------------
 {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}

Аналогичное выражение проверки предиката просто возвращает значение true, указывающее на наличие совпадения:

=> select jsonb_path_query(:'json', '$.track.segments[*].HR > 130');
 jsonb_path_query
------------------
 true

Примечание

Выражения проверки предикатов являются обязательными для использования в @@ операторе (а также в jsonb_path_match функции), и их не следует применять с помощью @? оператора (или jsonb_path_exists функции).

2.6.16.2.1.2. Интерпретация регулярных выражений #

Существуют незначительные различия в интерпретации шаблонов регулярных выражений, используемых в like_regex фильтрах, как описано в Раздел 2.6.16.2.4.

2.6.16.2.2. Режимы Strict и Lax #

При выполнении запросов к данным JSON выражение пути может не соответствовать фактической структуре данных JSON. Попытка обращения к несуществующему члену объекта или элементу массива определяется как структурная ошибка. Выражения пути языка SQL/JSON имеют два режима обработки структурных ошибок:

  • lax (по умолчанию) — механизм обработки путей неявно адаптирует запрашиваемые данные к указанному пути. Любые структурные ошибки, которые не могут быть исправлены описанным ниже способом, подавляются, не возвращая совпадений.

  • strict — при возникновении структурной ошибки выдается ошибка.

Режим lax упрощает сопоставление JSON-документа и выражения пути, когда данные JSON не соответствуют ожидаемой схеме. Если операнд не соответствует требованиям определенной операции, он может быть автоматически упакован в массив языка SQL/JSON или распакован путем преобразования его элементов в последовательность языка SQL/JSON перед выполнением операции. Кроме того, в режиме lax операторы сравнения автоматически разворачивают свои операнды, что позволяет сравнивать массивы языка SQL/JSON без дополнительной обработки. Массив размером 1 считается равным его единственному элементу. Автоматическое разворачивание не выполняется, если:

  • Выражение пути содержит type() или size() методы, возвращающие тип и количество элементов в массиве соответственно.

  • Запрашиваемые данные JSON содержат вложенные массивы. В этом случае разворачивается только самый внешний массив, тогда как все внутренние массивы остаются без изменений. Таким образом, неявное разворачивание может выполняться только на один уровень вглубь на каждом шаге вычисления пути.

Например, при обработке запроса к перечисленным выше данным GPS в режиме lax можно абстрагироваться от того факта, что в них хранится массив сегментов:

=> select jsonb_path_query(:'json', 'lax $.track.segments.location');
 jsonb_path_query
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]

В режиме strict указанный путь должен точно соответствовать структуре запрашиваемого документа JSON, поэтому использование данного выражения пути приведет к ошибке:

=> select jsonb_path_query(:'json', 'strict $.track.segments.location');
ERROR:  jsonpath member accessor can only be applied to an object

Для получения того же результата, что и в режиме lax, необходимо явно выполнить развертывание segments массива:

=> select jsonb_path_query(:'json', 'strict $.track.segments[*].location');
 jsonb_path_query
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]

Поведение режима lax при развертывании может привести к получению неожиданных результатов. Например, представленный ниже запрос, использующий .** аксессор, выбирает каждое значение HR дважды:

=> select jsonb_path_query(:'json', 'lax $.**.HR');
 jsonb_path_query
------------------
 73
 135
 73
 135

Это происходит вследствие того, что .** аксессор выбирает как сам segments массив и каждый из его элементов, тогда как .HR аксессор автоматически развертывает массивы при использовании режима lax. Во избежание непредвиденных результатов рекомендуется использовать функцию .** аксессор доступен только в строгом режиме (strict mode). Следующий запрос выбирает каждое HR значение только один раз:

=> select jsonb_path_query(:'json', 'strict $.**.HR');
 jsonb_path_query
------------------
 73
 135

Распаковка массивов также может привести к неожиданным результатам. Рассмотрим данный пример, в котором выбираются все массивы location:

=> select jsonb_path_query(:'json', 'lax $.track.segments[*].location');
 jsonb_path_query
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]
(2 rows)

Как и ожидалось, функция возвращает массивы целиком. Однако применение выражения фильтрации приводит к распаковке массивов для вычисления каждого элемента; при этом возвращаются только те элементы, которые соответствуют данному выражению:

=> select jsonb_path_query(:'json', 'lax $.track.segments[*].location ?(@[*] > 15)');
 jsonb_path_query
------------------
 47.763
 47.706
(2 rows)

Это происходит вопреки тому, что выражение пути выбирает массивы целиком. Для восстановления выборки массивов используйте строгий режим (strict mode):

=> select jsonb_path_query(:'json', 'strict $.track.segments[*].location ?(@[*] > 15)');
 jsonb_path_query
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]
(2 rows)

2.6.16.2.3. Операторы и методы путей языка SQL/JSON #

Таблица 2.6.50 содержит описание операторов и методов, доступных в jsonpath. Обратите внимание: в то время как унарные операторы и методы могут применяться к нескольким значениям, полученным на предыдущем шаге пути, бинарные операторы (сложение и т. д.) могут применяться только к одиночным значениям. В нестрогом режиме (lax mode) методы, применяемые к массиву, будут выполнены для каждого элемента в этом массиве. Исключение составляют методы .type() и .size(), которые применяются непосредственно к самому массиву.

Таблица 2.6.50. jsonpath Операторы и методы

Оператор/метод

Описание

Примеры

количество + количествоколичество

Сложение

jsonb_path_query('[2]', '$[0] + 3')5

+ количествоколичество

Унарный плюс (операция отсутствует); в отличие от сложения, данный оператор может выполнять итерацию по множественным значениям

jsonb_path_query_array('{"x": [2,3,4]}', '+ $.x')[2, 3, 4]

количество - количествоколичество

Вычитание

jsonb_path_query('[2]', '7 - $[0]')5

- количествоколичество

Отрицание; в отличие от вычитания, данная операция может применяться итеративно к множественным значениям

jsonb_path_query_array('{"x": [2,3,4]}', '- $.x')[-2, -3, -4]

количество * количествоколичество

Умножение

jsonb_path_query('[4]', '2 * $[0]')8

количество / количествоколичество

Деление

jsonb_path_query('[8.5]', '$[0] / 2')4.2500000000000000

количество % количествоколичество

Остаток от деления (modulo)

jsonb_path_query('[32]', '$[0] % 10')2

value . type()строка

Тип элемента JSON (см. json_typeof)

jsonb_path_query_array('[1, "2", {}]', '$[*].type()')["number", "string", "object"]

value . size()количество

Размер элемента JSON (количество элементов массива или 1, если элемент не является массивом)

jsonb_path_query('{"m": [11, 15]}', '$.m.size()')2

value . boolean()boolean

Логическое значение, полученное путем преобразования из типа boolean, числа или строки JSON

jsonb_path_query_array('[1, "yes", false]', '$[*].boolean()')[true, true, false]

value . string()строка

Строковое значение, полученное путем преобразования из JSON-типов boolean, number, string или datetime

jsonb_path_query_array('[1.23, "xyz", false]', '$[*].string()')["1.23", "xyz", "false"]

jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()')"2023-08-15T12:34:56"

value . double()количество

Число с плавающей точкой, полученное путем преобразования из JSON-типов number или string

jsonb_path_query('{"len": "1.9"}', '$.len.double() * 2')3.8

количество . ceiling()количество

Ближайшее целое число, большее или равное заданному

jsonb_path_query('{"h": 1.3}', '$.h.ceiling()')2

количество . floor()количество

Ближайшее целое число, меньшее или равное заданному

jsonb_path_query('{"h": 1.7}', '$.h.floor()')1

количество . abs()количество

Абсолютное значение заданного числа

jsonb_path_query('{"z": -0.3}', '$.z.abs()')0.3

value . bigint()bigint

Значение типа bigint, полученное путем преобразования числа или строки JSON

jsonb_path_query('{"len": "9876543219"}', '$.len.bigint()')9876543219

value . decimal( [ точность [ , масштаб ] ] )decimal

Округленное десятичное значение, полученное путем преобразования числа или строки JSON (точность и масштаб должны быть целочисленные значения)

jsonb_path_query('1234.5678', '$.decimal(6, 2)')1234.57

value . integer()integer

Целочисленное значение, полученное путем преобразования числа или строки JSON

jsonb_path_query('{"len": "12345"}', '$.len.integer()')12345

value . number()numeric

Числовое значение, полученное путем преобразования числа или строки JSON

jsonb_path_query('{"len": "123.45"}', '$.len.number()')123.45

строка . datetime()datetime_type (см. примечание)

Значение даты и времени, преобразованное из строки

jsonb_path_query('["2015-8-1", "2015-08-12"]', '$[*] ? (@.datetime() < "2015-08-2".datetime())')"2015-8-1"

строка . datetime(шаблон)datetime_type (см. примечание)

Значение даты и времени, преобразованное из строки с использованием указанного to_timestamp шаблон

jsonb_path_query_array('["12:30", "18:40"]', '$[*].datetime("HH24:MI")')["12:30:00", "18:40:00"]

строка . date()date

Значение даты, преобразованное из строки

jsonb_path_query('"2023-08-15"', '$.date()')"2023-08-15"

строка . time()время без часового пояса

Значение времени без часового пояса, преобразованное из строки

jsonb_path_query('"12:34:56"', '$.time()')"12:34:56"

строка . time(точность)время без часового пояса

Значение времени без часового пояса, преобразованное из строки, с дробной частью секунды, приведенные к заданной точности

jsonb_path_query('"12:34:56.789"', '$.time(2)')"12:34:56.79"

строка . time_tz()время с часовым поясом

Значение времени с часовым поясом, преобразованное из строки

jsonb_path_query('"12:34:56 +05:30"', '$.time_tz()')"12:34:56+05:30"

строка . time_tz(точность)время с часовым поясом

Значение времени с часовым поясом, преобразованное из строки, с дробной частью секунд секунды, приведенные к заданной точности

jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2)')"12:34:56.79+05:30"

строка . timestamp()отметка времени без часового пояса

Значение метки времени без часового пояса, преобразованное из строки

jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp()')"2023-08-15T12:34:56"

строка . timestamp(точность)отметка времени без часового пояса

Значение метки времени без часового пояса, преобразованное из строки, с дробной частью секунд, приведенной к заданной точности

jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2)')"2023-08-15T12:34:56.79"

строка . timestamp_tz()timestamp with time zone

Значение типа timestamp with time zone, преобразованное из строкового представления

jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()')"2023-08-15T12:34:56+05:30"

строка . timestamp_tz(точность)timestamp with time zone

Значение типа timestamp with time zone, преобразованное из строкового представления, с дробной частью секунды, приведенные к заданной точности

jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2)')"2023-08-15T12:34:56.79+05:30"

object . keyvalue()array

Пары «ключ-значение» объекта, представленные в виде массива объектов, содержащего три поля: "key", "value", и "id"; "id" является уникальным идентификатором объекта, к которому принадлежит данная пара «ключ-значение»

jsonb_path_query_array('{"x": "20", "y": 32}', '$.keyvalue()')[{"id": 0, "key": "x", "value": "20"}, {"id": 0, "key": "y", "value": 32}]


Примечание

Тип результата методов datetime() и datetime(шаблон) может быть date, timetz, time, timestamptz, или timestamp. Оба метода определяют тип возвращаемого значения динамически.

Метод datetime() последовательно сопоставляет входную строку с форматами ISO для типов date, timetz, time, timestamptz, и timestamp. Работа прекращается на первом подходящем формате, и возвращается соответствующий тип данных.

Метод datetime(шаблон) определяет тип результата в соответствии с полями, указанными в предоставленной строке шаблона.

Метод datetime() и datetime(шаблон) методы используют те же правила синтаксического анализа, что и to_timestamp функция языка SQL (см. Раздел 2.6.8), за тремя исключениями. Во-первых, данные методы не допускают использования несоответствующих шаблонов шаблона. Во-вторых, в строке шаблона разрешены только следующие разделители: знак минуса, точка, косая черта (слеш), запятая, апостроф, точка с запятой, двоеточие и пробел. В-третьих, разделители в строке шаблона должны строго соответствовать входной строке.

Если требуется сравнение различных типов даты и времени, применяется неявное приведение типов. date значение может быть приведено к типу timestamp OR timestamptz, timestamp может быть приведен к типу timestamptz, и time до timetz. Однако все эти преобразования, за исключением первого, зависят от текущей TimeZone настройки и, следовательно, могут выполняться только в рамках функций, учитывающих jsonpath часовой пояс. Аналогичным образом, прочие связанные с датой и временем методы, преобразующие строки в типы даты/времени, также осуществляют данное приведение типов, которое может задействовать текущую TimeZone настройки. Следовательно, данные преобразования также могут быть выполнены только внутри функций, учитывающих jsonpath часовой пояс.

Таблица 2.6.51 содержит доступные элементы выражений фильтрации.

Таблица 2.6.51. jsonpath Элементы выражений фильтрации

Предикат/Значение

Описание

Примеры

value == valueboolean

Сравнение на равенство (данный оператор, как и другие операторы сравнения, применим ко всем скалярным значениям JSON)

jsonb_path_query_array('[1, "a", 1, 3]', '$[*] ? (@ == 1)')[1, 1]

jsonb_path_query_array('[1, "a", 1, 3]', '$[*] ? (@ == "a")')["a"]

value != valueboolean

value <> valueboolean

Сравнение на неравенство

jsonb_path_query_array('[1, 2, 1, 3]', '$[*] ? (@ != 1)')[2, 3]

jsonb_path_query_array('["a", "b", "c"]', '$[*] ? (@ <> "b")')["a", "c"]

value < valueboolean

Операция сравнения «меньше»

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ < 2)')[1]

value <= valueboolean

Операция сравнения «меньше или равно»

jsonb_path_query_array('["a", "b", "c"]', '$[*] ? (@ <= "b")')["a", "b"]

value > valueboolean

Операция сравнения «больше»

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ > 2)')[3]

value >= valueboolean

Операция сравнения «больше или равно»

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ >= 2)')[2, 3]

trueboolean

Константа JSON true

jsonb_path_query('[{"name": "John", "parent": false}, {"name": "Chris", "parent": true}]', '$[*] ? (@.parent == true)'){"name": "Chris", "parent": true}

falseboolean

Константа JSON false

jsonb_path_query('[{"name": "John", "parent": false}, {"name": "Chris", "parent": true}]', '$[*] ? (@.parent == false)'){"name": "John", "parent": false}

nullvalue

Константа JSON null (обратите внимание: в отличие от языка SQL, сравнение с null выполняется обычным образом)

jsonb_path_query('[{"name": "Mary", "job": null}, {"name": "Michael", "job": "driver"}]', '$[*] ? (@.job == null) .name')"Mary"

boolean && booleanboolean

Логический оператор AND

jsonb_path_query('[1, 3, 7]', '$[*] ? (@ > 1 && @ < 5)')3

boolean || booleanboolean

Логический оператор OR

jsonb_path_query('[1, 3, 7]', '$[*] ? (@ < 1 || @ > 5)')7

! booleanboolean

Логический оператор NOT

jsonb_path_query('[1, 3, 7]', '$[*] ? (!(@ < 5))')7

boolean is unknownboolean

Проверяет, является ли логическое условие unknown.

jsonb_path_query('[-1, 2, 7, "foo"]', '$[*] ? ((@ > 0) is unknown)')"foo"

строка like_regex строка [ флаг строка ] → boolean

Данный оператор проверяет, соответствует ли первый операнд регулярному выражению, заданному во втором операнде, с возможными модификаторами, описанными в строке флаг символов (см. Раздел 2.6.16.2.4).

jsonb_path_query_array('["abc", "abd", "aBdC", "abdacb", "babc"]', '$[*] ? (@ like_regex "^ab.*c")')["abc", "abdacb"]

jsonb_path_query_array('["abc", "abd", "aBdC", "abdacb", "babc"]', '$[*] ? (@ like_regex "^ab.*c" flag "i")')["abc", "aBdC", "abdacb"]

строка starts with строкаboolean

Данный оператор проверяет, является ли второй операнд начальной подстрокой первого операнда.

jsonb_path_query('["John Smith", "Mary Stone", "Bob Johnson"]', '$[*] ? (@ starts with "John")')"John Smith"

exists ( path_expression )boolean

Данная функция проверяет, соответствует ли выражение пути хотя бы одному элементу SQL/JSON. Возвращает значение unknown если вычисление выражения пути приведет к возникновению ошибки; во втором примере эта возможность используется для предотвращения ошибки отсутствия ключа в строгом режиме.

jsonb_path_query('{"x": [1, 2], "y": [2, 4]}', 'strict $.* ? (exists (@ ? (@[*] > 2)))')[2, 4]

jsonb_path_query_array('{"value": 41}', 'strict $ ? (exists (@.name)) .name')[]


2.6.16.2.4. Регулярные выражения #

Выражения пути SQL/JSON позволяют выполнять сопоставление текста с регулярным выражением при помощи оператора like_regex фильтра. Например, приведенный ниже запрос пути SQL/JSON найдет без учета регистра все строки в массиве, начинающиеся с английской гласной:

$[*] ? (@ like_regex "^[aeiou]" flag "i")

Необязательное флаг строка может содержать один или несколько символов i для поиска без учета регистра букв, m разрешить ^ и $ для сопоставления с символами новой строки, s разрешить . для сопоставления с символом новой строки, и q для экранирования всего шаблона (что сводит операцию к простому поиску подстроки).

Стандарт SQL/JSON заимствует определение регулярных выражений из LIKE_REGEX оператора, который, в свою очередь, использует стандарт XQuery. Digital Q.DataBase в настоящее время не поддерживает LIKE_REGEX оператор. Следовательно, фильтр like_regex реализован с использованием механизма регулярных выражений стандарта POSIX, описанного в Раздел 2.6.7.3. Это приводит к различным незначительным расхождениям со стандартным поведением языка SQL/JSON, которые перечислены в Раздел 2.6.7.3.8. Однако следует учитывать, что описанные там несовместимости буквенных флагов не распространяются на язык SQL/JSON, так как в нем выполняется трансляция буквенных флагов XQuery для обеспечения соответствия ожиданиям механизма стандарта POSIX.

Необходимо учитывать, что аргумент-шаблон функции like_regex является строковым литералом пути JSON, составленным согласно правилам, изложенным в Раздел 2.5.14.7. В частности, это означает, что любые символы обратной косой черты, используемые в регулярном выражении, должны быть удвоены. Например, для поиска соответствия строковым значениям корневого документа, содержащим только цифры:

$.* ? (@ like_regex "^\\d+$")

2.6.16.3. Функции запросов SQL/JSON #

Функции SQL/JSON JSON_EXISTS(), JSON_QUERY(), и JSON_VALUE() описано в Таблица 2.6.52 могут быть использованы для выполнения запросов к документам JSON. Каждая из этих функций применяет path_expression (запрос на языке SQL/JSON path) к context_item (документу). См. Раздел 2.6.16.2 для получения подробной информации о том, что может содержать path_expression . Выражение path_expression также может ссылаться на переменные, значения которых указываются под соответствующими именами в PASSING предложении, поддерживаемом каждой функцией. context_item может быть jsonb значением или символьной строкой, которая может быть успешно приведена к типу jsonb.

Таблица 2.6.52. Функции запросов SQL/JSON

Сигнатура функции

Описание

Пример(ы)

JSON_EXISTS (
context_item, path_expression
[ PASSING { value AS varname } [, ...]]
[{ TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ]) → boolean

  • Функция возвращает логическое значение true, если выражение SQL/JSON path_expression примененное к объекту context_item возвращает любые элементы, и значение false в противном случае.

  • Данный ON ERROR Предложение определяет поведение в случае, если возникает ошибка в процессе path_expression вычисления выражения. Указание параметра ERROR вызовет генерацию ошибки с соответствующим диагностическим сообщением. К другим вариантам относятся возвращающих тип boolean значения FALSE или TRUE или значение UNKNOWN которое фактически представляет собой NULL в языке SQL. Если не указано ON ERROR Предназначением указанного предложения является возврат boolean timestamp, FALSE.

Примеры:

JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > $x)' PASSING 2 AS x)t

JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR)f

JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR)

ОШИБКА: индекс массива jsonpath вышел за границы диапазона

JSON_QUERY (
context_item, path_expression
[ PASSING { value AS varname } [, ...]]
[ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ]
[ { WITHOUT | WITH { CONDITIONAL | [UNCONDITIONAL] } } [ ARRAY ] WRAPPER ]
[ { KEEP | OMIT } QUOTES [ ON SCALAR STRING ] ]
[ { ERROR | NULL | EMPTY { [ ARRAY ] | OBJECT } | DEFAULT выражение } ON EMPTY ]
[ { ERROR | NULL | EMPTY { [ ARRAY ] | OBJECT } | DEFAULT выражение } ON ERROR ]) → jsonb

  • Данная функция возвращает результат применения выражения языка SQL/JSON path_expression к context_item.

  • По умолчанию результат возвращается в виде значения типа jsonb, хотя предложение RETURNING может использоваться для возврата значения в виде другого типа, к которому данное значение может быть успешно приведено.

  • Если выражение пути может возвращать несколько значений, может возникнуть необходимость инкапсулировать эти значения с помощью WITH WRAPPER предложения, чтобы сформировать корректную строку JSON, поскольку по умолчанию упаковка не производится, как если бы было задано WITHOUT WRAPPER . Предложение WITH WRAPPER по умолчанию воспринимается как WITH UNCONDITIONAL WRAPPER, что подразумевает упаковку даже одиночного результирующего значения. Для применения упаковки только в тех случаях, когда возвращается несколько значений, следует указать WITH CONDITIONAL WRAPPER. Получение нескольких значений в результате будет интерпретироваться как ошибка, если WITHOUT WRAPPER указано соответствующее условие.

  • Если результат является скалярной строкой, то по умолчанию возвращаемое значение будет заключено в кавычки, что делает его корректным значением JSON. Данное поведение можно задать явно, указав параметр KEEP QUOTES. Напротив, кавычки могут быть опущены при указании параметра OMIT QUOTES. Для обеспечения того, чтобы результат являлся корректным значением JSON, OMIT QUOTES не может быть указано, если также WITH WRAPPER задано соответствующее значение.

  • Данный ON EMPTY Предложение определяет поведение в случае, если вычисление выражения path_expression возвращает пустое множество. Предложение (clause) ON ERROR определяет алгоритм действий в случае возникновения ошибки при вычислении path_expression, при приведении результирующего значения к RETURNING типу, или при вычислении ON EMPTY выражения в случае, если path_expression в результате вычисления возвращается пустое множество.

  • В обоих случаях ON EMPTY и ON ERROR, указание ERROR вызывает ошибку с соответствующим сообщением. Другие варианты включают возврат значения NULL языка SQL, пустого массива (EMPTY [ARRAY]), пустого объекта (EMPTY OBJECT), или заданного пользователем выражения (DEFAULT выражение) которое может быть приведено к типу jsonb или типу, указанному в RETURNING. Если данный параметр ON EMPTY или ON ERROR не указан, то по умолчанию возвращается значение NULL языка SQL.

Примеры:

JSON_QUERY(jsonb '[1,[2,3],null]', 'lax $[*][$off]' PASSING 1 AS off WITH CONDITIONAL WRAPPER)3

JSON_QUERY(jsonb '{"a": "[1, 2]"}', 'lax $.a' OMIT QUOTES)[1, 2]

JSON_QUERY(jsonb '{"a": "[1, 2]"}', 'lax $.a' RETURNING int[] OMIT QUOTES ERROR ON ERROR)

ERROR:  malformed array literal: "[1, 2]"
DETAIL:  Missing "]" after array dimensions.

JSON_VALUE (
context_item, path_expression
[ PASSING { value AS varname } [, ...]]
[ RETURNING data_type ]
[ { ERROR | NULL | DEFAULT выражение } ON EMPTY ]
[ { ERROR | NULL | DEFAULT выражение } ON ERROR ]) → text

  • Данная функция возвращает результат применения выражения языка SQL/JSON path_expression к context_item.

  • Используйте данную конструкцию JSON_VALUE() только в том случае, если извлекаемое значение должно быть одиночным SQL/JSON скалярным элементом; получение нескольких значений будет обработано как ошибка. Если предполагается, что извлеченным значением может быть объект или массив, используйте вместо этого JSON_QUERY соответствующую функцию.

  • По умолчанию результат, который должен представлять собой одиночное скалярное значение, — это возвращается в виде значения типа text, однако RETURNING предложение может быть использовано для возврата значения в виде некоторого другого типа, к которому данное значение может быть успешно приведено.

  • Данный ON ERROR и ON EMPTY предложения имеют семантику, аналогичную описанной для JSON_QUERY, за исключением того, что набор значений, возвращаемых вместо генерации ошибки, является иным.

  • Обратите внимание, что в скалярных строках, возвращаемых функцией, JSON_VALUE кавычки всегда удаляются, что эквивалентно указанию OMIT QUOTES в JSON_QUERY.

Примеры:

JSON_VALUE(jsonb '"123.45"', '$' RETURNING float)123.45

JSON_VALUE(jsonb '"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date)2015-02-01

JSON_VALUE(jsonb '[1,2]', 'strict $[$off]' PASSING 1 as off)2

JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 9 ON ERROR)9


Примечание

Данный context_item выражение преобразуется в тип jsonb посредством неявного приведения, если оно еще не относится к типу jsonb. Следует, однако, учитывать, что любые ошибки синтаксического анализа, возникающие при таком преобразовании, генерируются безусловно, то есть не обрабатываются в соответствии с заданным или подразумеваемым ON ERROR предложение.

Примечание

JSON_VALUE() возвращает значение NULL языка SQL, если path_expression возвращает данные JSON null, тогда как JSON_QUERY() возвращает данные JSON null в исходном виде.

2.6.16.4. JSON_TABLE #

JSON_TABLE представляет собой функцию стандарта SQL/JSON, которая выполняет запросы к JSON данным и представляет результаты в виде реляционного представления, доступного как обычная таблица языка SQL. Можно использовать JSON_TABLE внутри предложения FROM в SELECT, UPDATE, или DELETE а также в качестве источника данных в инструкции MERGE statement.

Принимая на вход данные JSON, JSON_TABLE использует выражение JSON path для извлечения части предоставленных данных, которая будет использоваться в качестве шаблона строки для сформированного представления. Каждое значение SQL/JSON, заданное шаблоном строки, служит источником данных для отдельной строки в сформированном представлении.

Для разделения шаблона строки на столбцы JSON_TABLE предоставляет COLUMNS предложение, определяющее схему создаваемого представления. Для каждого столбца может быть указано отдельное выражение пути JSON; оно вычисляется применительно к шаблону строки для получения значения SQL/JSON, которое становится значением соответствующего столбца в данной выходной строке.

Данные JSON, хранящиеся на вложенном уровне шаблона строки, могут быть извлечены с помощью предложения NESTED PATH предложение. Каждое такое NESTED PATH предложение может быть использовано для формирования одного или нескольких столбцов на основе данных с вложенного уровня шаблона строки. Данные столбцы могут быть определены с помощью предложения COLUMNS структура которого аналогична предложению COLUMNS верхнего уровня. Строки, сформированные из NESTED COLUMNS, называются дочерние строки и соединяются со строкой, сформированной на основе столбцов, указанных в родительском элементе, COLUMNS предложение для получения строки в результирующем представлении. Сами дочерние столбцы могут содержать NESTED PATH спецификацию, позволяющую извлекать данные, находящиеся на произвольных уровнях вложенности. Столбцы, сформированные несколькими NESTED PATHна одном и том же уровне, рассматриваются как одноуровневые элементы по отношению друг к другу, и их строки после соединения с родительской строкой объединяются с помощью оператора UNION.

Строки, сформированные функцией JSON_TABLE присоединяются к сгенерировавшей их строке посредством латерального соединения (LATERAL JOIN), что исключает необходимость явного соединения сконструированного представления с исходной таблицей, содержащей JSON данные.

Синтаксис:

JSON_TABLE (
    context_item, path_expression [ AS json_path_name ] [ PASSING { value AS varname } [, ...] ]
    COLUMNS ( json_table_column [, ...] )
    [ { ERROR | EMPTY [ARRAY]} ON ERROR ]
)


где json_table_column следующее:

  name FOR ORDINALITY
  | name тип
        [ FORMAT JSON [ENCODING UTF8]]
        [ PATH path_expression ]
        [ { WITHOUT | WITH { CONDITIONAL | [UNCONDITIONAL] } } [ ARRAY ] WRAPPER ]
        [ { KEEP | OMIT } QUOTES [ ON SCALAR STRING ] ]
        [ { ERROR | NULL | EMPTY { [ARRAY] | OBJECT } | DEFAULT выражение } ON EMPTY ]
        [ { ERROR | NULL | EMPTY { [ARRAY] | OBJECT } | DEFAULT выражение } ON ERROR ]
  | name тип EXISTS [ PATH path_expression ]
        [ { ERROR | TRUE | FALSE | UNKNOWN } ON ERROR ]
  | NESTED [ PATH ] path_expression [ AS json_path_name ] COLUMNS ( json_table_column [, ...] )

Ниже каждый элемент синтаксиса описан более подробно.

context_item, path_expression [ AS json_path_name ] [ PASSING { value AS varname } [, ...]]

context_item определяет входной документ для выполнения запроса, path_expression является выражением пути на языке SQL/JSON, определяющим запрос, а json_path_name является необязательным именем для path_expression. Необязательное PASSING предложение предоставляет значения данных для переменных, указанных в path_expression. Результат вычисления входных данных с применением вышеупомянутых элементов называется шаблона строки, который используется в качестве источника значений строк в формируемом представлении.

COLUMNS ( json_table_column [, ...] )

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

name FOR ORDINALITY

Добавляет столбец порядковых номеров, обеспечивающий последовательную нумерацию строк, начиная с 1. Для каждого NESTED PATH (см. ниже) используется собственный счетчик для любых вложенных столбцов порядковых номеров.

name тип [FORMAT JSON [ENCODING UTF8]] [ PATH path_expression ]

Вставляет значение на языке SQL/JSON, полученное в результате применения path_expression сопоставленный с шаблоном строки в выходную строку представления после его приведения к указанному тип.

Указание данного параметра FORMAT JSON явно указывает на то, что значение должно быть корректным json объектом. Указание данного параметра имеет смысл только FORMAT JSON если тип является одним из bpchar, bytea, character varying, name, json, jsonb, text, или домен, основанный на этих типах данных.

Дополнительно можно указать WRAPPER и QUOTES предложения (clauses) для форматирования выходных данных. Обратите внимание, что указание OMIT QUOTES переопределяет действие параметра FORMAT JSON если он также указан, поскольку литералы без кавычек не являются корректными json значений.

При необходимости можно использовать ON EMPTY и ON ERROR предложения для определения того, следует ли генерировать ошибку или возвращать указанное значение в случаях, когда результат вычисления пути JSON пуст, когда возникает ошибка при вычислении пути JSON или когда выполняется приведение значения языка SQL/JSON к указанному типу соответственно. По умолчанию в обоих случаях возвращается NULL value.

Примечание

Данное предложение внутренне преобразуется и имеет ту же семантику, что и JSON_VALUE или JSON_QUERY. Последний вариант используется, если указанный тип не является скалярным или если любой из FORMAT JSON, WRAPPER, или QUOTES присутствует предложение.

name тип EXISTS [ PATH path_expression ]

Вставляет логическое значение, полученное в результате применения path_expression к шаблону строки, в выходную строку представления после его приведения к указанному тип.

Данное значение указывает на то, возвращает ли применение PATH выражения к шаблону строки какие-либо значения.

Указанный тип должен поддерживать приведение из boolean типа.

При необходимости можно использовать ON ERROR для указания того, следует ли генерировать ошибку или возвращать указанное значение при возникновении ошибки в ходе вычисления пути JSON или при приведении значения SQL/JSON к указанному типу. По умолчанию возвращается логическое значение FALSE.

Примечание

Данное предложение внутренне преобразуется и имеет ту же семантику, что и JSON_EXISTS.

NESTED [ PATH ] path_expression [ AS json_path_name ] COLUMNS ( json_table_column [, ...] )

Извлекает значения SQL/JSON из вложенных уровней шаблона строки, формирует один или несколько столбцов, определенных в COLUMNS подпредложении, и вставляет извлеченные значения SQL/JSON в эти столбцы. Предложение json_table_column выражение в COLUMNS подпредложение использует тот же синтаксис, что и в родительском предложении COLUMNS предложении.

NESTED PATH синтаксис является рекурсивным, что позволяет переходить на несколько уровней вложенности путём указания нескольких NESTED PATH вложенные друг в друга подвыражения. Это позволяет раскрыть иерархию объектов и массивов JSON за один вызов функции вместо последовательного объединения нескольких вызовов JSON_TABLE выражения в операторе языка SQL.

Примечание

В каждом из вариантов json_table_column описанных выше, если PATH предложение опущено, применяется выражение пути $.name , в котором name является указанным именем столбца.

AS json_path_name

Необязательное json_path_name служит идентификатором предоставленного path_expression. Данное имя должно быть уникальным и отличаться от имен столбцов.

{ ERROR | EMPTY } ON ERROR

Необязательное ON ERROR может использоваться для указания способа обработки ошибок при вычислении выражения верхнего уровня path_expression. Используйте ERROR если требуется генерация исключения при ошибке, и EMPTY для возврата пустой таблицы, то есть таблицы, содержащей 0 строк. Обратите внимание на то, что данное предложение не влияет на ошибки, возникающие при вычислении значений в столбцах; поведение в таких случаях зависит от того, ON ERROR Данное предложение указывается для конкретного столбца.

Примеры

В нижеследующих примерах используется таблица, содержащая данные типа JSON:

CREATE TABLE my_films ( js jsonb );

INSERT INTO my_films VALUES (
'{ "favorites" : [
   { "kind" : "comedy", "films" : [
     { "title" : "Bananas",
       "director" : "Woody Allen"},
     { "title" : "The Dinner Game",
       "director" : "Francis Veber" } ] },
   { "kind" : "horror", "films" : [
     { "title" : "Psycho",
       "director" : "Alfred Hitchcock" } ] },
   { "kind" : "thriller", "films" : [
     { "title" : "Vertigo",
       "director" : "Alfred Hitchcock" } ] },
   { "kind" : "drama", "films" : [
     { "title" : "Yojimbo",
       "director" : "Akira Kurosawa" } ] }
  ] }');

В следующем запросе показано использование функции JSON_TABLE для преобразования объектов JSON из my_films таблицы в представление со столбцами, соответствующими ключам kind, title, и директоров содержащимся в исходном объекте JSON, а также со столбцом порядковых номеров:

SELECT jt.* FROM
 my_films,
 JSON_TABLE (js, '$.favorites[*]' COLUMNS (
   id FOR ORDINALITY,
   kind text PATH '$.kind',
   title text PATH '$.films[*].title' WITH WRAPPER,
   director text PATH '$.films[*].director' WITH WRAPPER)) AS jt;

 id |   kind   |             title              |             director
----+----------+--------------------------------+----------------------------------
  1 | comedy   | ["Bananas", "The Dinner Game"] | ["Woody Allen", "Francis Veber"]
  2 | horror   | ["Psycho"]                     | ["Alfred Hitchcock"]
  3 | thriller | ["Vertigo"]                    | ["Alfred Hitchcock"]
  4 | drama    | ["Yojimbo"]                    | ["Akira Kurosawa"]
(4 строки)

Ниже приведена модифицированная версия вышеуказанного запроса, демонстрирующая использование PASSING аргументы в фильтре выражения пути JSON верхнего уровня, а также от различных параметров для отдельных столбцов:

SELECT jt.* FROM
 my_films,
 JSON_TABLE (js, '$.favorites[*] ? (@.films[*].director == $filter)'
   PASSING 'Alfred Hitchcock' AS filter, 'Vertigo' AS filter2
     COLUMNS (
     id FOR ORDINALITY,
     kind text PATH '$.kind',
     title text FORMAT JSON PATH '$.films[*].title' OMIT QUOTES,
     director text PATH '$.films[*].director' KEEP QUOTES)) AS jt;

 id |   kind   |  title  |      director
----+----------+---------+--------------------
  1 | horror   | Psycho  | "Alfred Hitchcock"
  2 | thriller | Vertigo | "Alfred Hitchcock"
(2 строки)

Ниже приведена модифицированная версия вышеуказанного запроса, демонстрирующая использование NESTED PATH для заполнения столбцов title и director, которая иллюстрирует способ их объединения с родительскими столбцами id и kind:

SELECT jt.* FROM
 my_films,
 JSON_TABLE ( js, '$.favorites[*] ? (@.films[*].director == $filter)'
   PASSING 'Alfred Hitchcock' AS filter
   COLUMNS (
    id FOR ORDINALITY,
    kind text PATH '$.kind',
    NESTED PATH '$.films[*]' COLUMNS (
      title text FORMAT JSON PATH '$.title' OMIT QUOTES,
      director text PATH '$.director' KEEP QUOTES))) AS jt;

 id |   kind   |  title  |      director
----+----------+---------+--------------------
  1 | horror   | Psycho  | "Alfred Hitchcock"
  2 | thriller | Vertigo | "Alfred Hitchcock"
(2 строки)

Ниже приведен тот же запрос, но без применения фильтра в корневом пути:

SELECT jt.* FROM
 my_films,
 JSON_TABLE ( js, '$.favorites[*]'
   COLUMNS (
    id FOR ORDINALITY,
    kind text PATH '$.kind',
    NESTED PATH '$.films[*]' COLUMNS (
      title text FORMAT JSON PATH '$.title' OMIT QUOTES,
      director text PATH '$.director' KEEP QUOTES))) AS jt;

 id |   kind   |      title      |      director
----+----------+-----------------+--------------------
  1 | comedy   | Bananas         | "Woody Allen"
  1 | comedy   | The Dinner Game | "Francis Veber"
  2 | horror   | Psycho          | "Alfred Hitchcock"
  3 | thriller | Vertigo         | "Alfred Hitchcock"
  4 | drama    | Yojimbo         | "Akira Kurosawa"
(5 rows)

Ниже показан другой запрос, использующий в качестве входных данных иной JSON объект. В нем демонстрируется применение «соединения смежных элементов» (sibling join) через оператор UNION между NESTED путями $.movies[*] и $.books[*] а также использование FOR ORDINALITY столбца на NESTED уровнях (столбцы movie_id, book_id, и author_id):

SELECT * FROM JSON_TABLE (
'{"favorites":
    {"movies":
      [{"name": "One", "director": "John Doe"},
       {"name": "Two", "director": "Don Joe"}],
     "books":
      [{"name": "Mystery", "authors": [{"name": "Brown Dan"}]},
       {"name": "Wonder", "authors": [{"name": "Jun Murakami"}, {"name":"Craig Doe"}]}]
}}'::json, '$.favorites[*]'
COLUMNS (
  user_id FOR ORDINALITY,
  NESTED '$.movies[*]'
    COLUMNS (
    movie_id FOR ORDINALITY,
    mname text PATH '$.name',
    director text),
  NESTED '$.books[*]'
    COLUMNS (
      book_id FOR ORDINALITY,
      bname text PATH '$.name',
      NESTED '$.authors[*]'
        COLUMNS (
          author_id FOR ORDINALITY,
          author_name text PATH '$.name'))));

 user_id | movie_id | mname | director | book_id |  bname  | author_id | author_name
---------+----------+-------+----------+---------+---------+-----------+--------------
       1 |        1 | One   | John Doe |         |         |           |
       1 |        2 | Two   | Don Joe  |         |         |           |
       1 |          |       |          |       1 | Mystery |         1 | Brown Dan
       1 |          |       |          |       2 | Wonder  |         1 | Jun Murakami
       1 |          |       |          |       2 | Wonder  |         2 | Craig Doe
(5 rows)

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

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