Функции и операторы JSON#
Стандарт SQL описывает функции и операторы для обработки данных JSON. Они позволяют получать доступ к данным JSON в соответствии с их структурой, генерировать данные JSON, и постоянно хранить его в таблицах SQL.
Важно отметить, что стандарт SQL требует, чтобы не было выделенного типа данных.
представлять данные JSON в SQL. Вместо этого данные JSON представлены в виде символов или
двоичные строки. Хотя Trino поддерживаетJSONтипа, он не используется или
производится следующими функциями.
Trino поддерживает три функции для запроса данных JSON: json_exists, json_queryи json_value. Каждый из них основан на том же механизме изучения и обработки ввода JSON с использованием JSON-путь.
Trino также поддерживает две функции для генерации данных JSON: json_arrayи json_object.
Язык пути JSON#
Язык путей JSON — это специальный язык, используемый исключительно определенными SQL-серверами. операторы, чтобы указать запрос, который будет выполняться на входе JSON. Хотя путь JSON выражения встроены в SQL-запросы, их синтаксис существенно отличается из SQL. Семантика предикатов, операторов и т. д. в выражениях пути JSON. обычно следуют семантике SQL. Язык пути JSON чувствителен к регистру. для ключевых слов и идентификаторов.
Синтаксис и семантика пути JSON#
Выражения пути JSON представляют собой рекурсивные структуры. Хотя название «путь» предлагает линейную последовательность операций, шаг за шагом углубляющуюся в JSON. структура, выражение пути JSON на самом деле является деревом. Он может получить доступ к вводу Элемент JSON несколько раз, разными способами и объедините результаты. Более того, результатом выражения пути JSON является не отдельный элемент, а упорядоченный последовательность предметов. Каждое из подвыражений принимает один или несколько входных данных. последовательности и возвращает последовательность в качестве результата.
Note
В слабом режиме большинство операций с путями сначала отменяют вложение всех массивов JSON в последовательность ввода. Любое отклонение от этого правила упоминается ниже. листинг. Режимы пути описаны в Режимы пути JSON.
Функции языка путей JSON делятся на: литералы, переменные, арифметические двоичные выражения, арифметические унарные выражения и группа операторы, известные под общим названием аксессоры.
литералы#
числовые литералы
Они включают точные и приблизительные цифры и интерпретируются так, как будто они были значениями SQL.
-1, 1.2e3, NaN
строковые литералы
Они заключены в двойные кавычки.
"Some text"
логические литералы
true, false
нулевой литерал
Он имеет семантику нуля JSON, а не нуля SQL. См. Правила сравнения.
null
переменные#
контекстная переменная
Это относится к обрабатываемому в данный момент вводу JSON. функция.
$
именованная переменная
Он ссылается на именованный параметр по его имени.
$param
текущая переменная элемента
Он используется внутри выражения фильтра для ссылки на обрабатываемый в данный момент элемент из входной последовательности.
@
последняя переменная нижнего индекса
Он относится к последнему индексу самого внутреннего охватывающего массива. Индексы массива в выражениях пути JSON отсчитываются от нуля.
last
арифметические двоичные выражения#
Язык путей JSON поддерживает пять арифметических бинарных операторов:
<path1> + <path2>
<path1> - <path2>
<path1> * <path2>
<path1> / <path2>
<path1> % <path2>
Оба операнда,<path1>и<path2>, оцениваются для последовательностей
предметы. Для арифметических бинарных операторов каждая входная последовательность должна содержать
один числовой элемент. Арифметическая операция выполняется согласно SQL
семантику и возвращает последовательность, содержащую один элемент с
результат.
Операторы следуют тем же правилам приоритета, что и в арифметических операциях SQL. и круглые скобки можно использовать для группировки.
арифметические унарные выражения#
+ <path>
- <path>
Операнд <path>оценивается как последовательность элементов. Каждый предмет должен быть
числовое значение. Унарный плюс или минус применяется к каждому элементу в
последовательность, соответствующую семантике SQL, а результаты формируют возвращаемую последовательность.
метод доступа к члену#
Метод доступа к элементу возвращает значение элемента с указанным ключом для каждый объект JSON во входной последовательности.
<path>.key
<path>."key"
Условие, когда объект JSON не имеет такого члена, называется структурная ошибка. В нестрогом режиме он подавляется, а неисправный объект исключен из результата.
Позволять<path>вернуть последовательность из трех объектов JSON:
{"customer" : 100, "region" : "AFRICA"},
{"region" : "ASIA"},
{"customer" : 300, "region" : "AFRICA", "comment" : null}
выражение <path>.customerпреуспевает в первом и третьем объекте,
но второму объекту не хватает обязательного члена. В строгом режиме путь
оценка не удалась. В слабом режиме второй объект молча пропускается, а
результирующая последовательность100, 300.
Все элементы входной последовательности должны быть объектами JSON.
Note
Trino не поддерживает объекты JSON с повторяющимися ключами.
метод доступа к члену с подстановочным знаком#
Возвращает значения из всех пар ключ-значение для каждого объекта JSON во входных данных. последовательность. Все частичные результаты объединяются в возвращаемую последовательность.
<path>.*
Позволять<path>вернуть последовательность из трех объектов JSON:
{"customer" : 100, "region" : "AFRICA"},
{"region" : "ASIA"},
{"customer" : 300, "region" : "AFRICA", "comment" : null}
Результаты:
100, "AFRICA", "ASIA", 300, "AFRICA", null
Все элементы входной последовательности должны быть объектами JSON.
Порядок значений, возвращаемых из одного объекта JSON, является произвольным. подпоследовательности всех объектов JSON объединяются в том же порядке, в котором объекты JSON появляются во входной последовательности.
метод доступа к члену-потомку#
Возвращает значения, связанные с указанным ключом во всех объектах JSON на всех уровни вложенности во входной последовательности.
<path>..key
<path>.."key"
Порядок возвращаемых значений соответствует порядку поиска в глубину. Во-первых, Посещается охватывающий объект, а затем посещаются все дочерние узлы.
Этот метод не выполняет развертывание массива в слабом режиме. Результаты одинаковы в мягком и строгом режимах. Метод переходит в JSON массивы и объекты JSON. Неструктурные элементы JSON пропускаются.
Позволять<path>быть последовательностью, содержащей объект JSON:
{
"id" : 1,
"notes" : [{"type" : 1, "comment" : "foo"}, {"type" : 2, "comment" : null}],
"comment" : ["bar", "baz"]
}
<path>..comment --> ["bar", "baz"], "foo", null
метод доступа к массиву#
Возвращает элементы по указанным индексам для каждого массива JSON во входных данных. последовательность. Индексы начинаются с нуля.
<path>[ <subscripts> ]
<subscripts>список содержит один или несколько индексов. Каждый индекс
указывает один индекс или диапазон (оканчивается включительно):
<path>[<path1>, <path2> to <path3>, <path4>,...]
В нестрогом режиме любые элементы, не являющиеся массивами, возникающие в результате оценки входных данных. последовательности упакованы в одноэлементные массивы. Обратите внимание, что это исключение к правилу автоматического переноса массива.
Каждый массив во входной последовательности обрабатывается следующим образом:
Переменная
lastустанавливается на последний индекс массива.Все индексы индексов вычисляются в порядке объявления. Для одноэлементный индекс
<path1>, результатом должен быть одноэлементный числовой элемент. Для индекса диапазона<path2> to <path3>, ожидается два числовых элемента.Указанные элементы массива добавляются в выходную последовательность по порядку.
Позволять<path>вернуть последовательность из трех массивов JSON:
[0, 1, 2], ["a", "b", "c", "d"], [null, null]
Следующее выражение возвращает последовательность, содержащую последний элемент из каждый массив:
<path>[last] --> 2, "d", null
Следующее выражение возвращает третий и четвертый элемент каждого массива:
<path>[2 to 3] --> 2, "c", "d"
Обратите внимание, что в первом массиве нет четвертого элемента, а в последнем массиве не имеет третьего или четвертого элемента. Доступ к несуществующим элементам структурная ошибка. В строгом режиме это приводит к сбою выражения пути. В слабом режиме такие ошибки подавляются и возвращаются только существующие элементы.
Другим примером структурной ошибки является неправильное указание диапазона, например
как 5 to 3.
Обратите внимание, что индексы могут перекрываться, и они не обязательно должны соответствовать порядок элементов. Порядок в возвращаемой последовательности соответствует индексам:
<path>[1, 0, 0] --> 1, 0, 0, "b", "a", "a", null, null, null
метод доступа к массиву с подстановочными знаками#
Возвращает все элементы каждого массива JSON во входной последовательности.
<path>[*]
В нестрогом режиме любые элементы, не являющиеся массивами, возникающие в результате оценки входных данных. последовательности упакованы в одноэлементные массивы. Обратите внимание, что это исключение к правилу автоматического переноса массива.
Порядок вывода соответствует порядку исходных массивов JSON. Кроме того, порядок элементов внутри массивов сохраняется.
Позволять<path>вернуть последовательность из трех массивов JSON:
[0, 1, 2], ["a", "b", "c", "d"], [null, null]
<path>[*] --> 0, 1, 2, "a", "b", "c", "d", null, null
фильтр#
Извлекает элементы входной последовательности, удовлетворяющие предикату.
<path>?( <predicate> )
Предикаты пути JSON синтаксически аналогичны логическим выражениям в SQL. Однако семантика различается во многих аспектах:
Они оперируют последовательностями элементов.
У них есть своя обработка ошибок (никогда не подводят).
Они ведут себя по-разному в зависимости от мягкого или строгого режима.
Предикат оценивается как true,false, илиunknown. Обратите внимание, что некоторые
выражения предикатов включают в себя вложенное выражение пути JSON. При оценке
вложенный путь, переменная @относится к текущему исследуемому элементу из
последовательность ввода.
Поддерживаются следующие выражения предикатов:
Соединение
<predicate1> && <predicate2>
Дизъюнкция
<predicate1> || <predicate2>
Отрицание
! <predicate>
existsпредикат
exists( <path> )
Возвратtrueесли вложенный путь представляет собой непустую последовательность, и
falseкогда вложенный путь оценивается как пустая последовательность. Если путь
оценка выдает ошибку, возвращаетunknown.
starts withпредикат
<path> starts with "Some text"
<path> starts with $variable
Вложенный <path>должен оценивать последовательность текстовых элементов, а
другой операнд должен оцениваться как один текстовый элемент. Если оценка того или иного
операнд выдает ошибку, результатunknown. Все предметы из последовательности
проверяются на предмет начала с правильного операнда. Результатtrueесли
совпадение найдено, иначе false. Однако, если какое-либо из сравнений выдает
ошибка, результат в строгом режиме unknown. Результат в слабом
Режим зависит от того, было ли совпадение или ошибка обнаружено первым.
is unknownпредикат
( <predicate> ) is unknown
Возвратtrueесли вложенный предикат имеет значениеunknown, и
falseв противном случае.
Сравнения
<path1> == <path2>
<path1> <> <path2>
<path1> != <path2>
<path1> < <path2>
<path1> > <path2>
<path1> <= <path2>
<path1> >= <path2>
Оба операнда сравнения оценивают последовательность элементов. Если либо
оценка выдает ошибку, результатunknown. Предметы слева и
правая последовательность затем сравнивается попарно. Аналогично starts with
предикат, результатtrueесли какое-либо из сравнений возвращаетtrue,
в противном случае false. Однако если какое-либо из сравнений выдает ошибку, например
Например, поскольку сравниваемые типы несовместимы, результат будет строгим.
режим unknown. Результат в слабом режиме зависит от того,true
сравнение или ошибка была обнаружена первой.
Правила сравнения#
Значения NULL в контексте сравнения ведут себя иначе, чем NULL SQL:
ноль == ноль –>
truenull != null, null < null, … –>
falseноль по сравнению со скалярным значением –>
falseноль по сравнению с массивом JSON или объектом JSON –>
false
При сравнении двух скалярных значений trueилиfalseвозвращается, если
сравнение успешно выполнено. Семантика сравнения заключается в
то же, что и в SQL. В случае ошибки, например. сравнение текста и числа,
unknownвозвращается.
Сравнение скалярного значения с массивом JSON или объектом JSON и сравнение JSON
массивы/объекты - это ошибка, поэтомуunknownвозвращается.
Примеры фильтров#
Позволять<path>вернуть последовательность из трех объектов JSON:
{"customer" : 100, "region" : "AFRICA"},
{"region" : "ASIA"},
{"customer" : 300, "region" : "AFRICA", "comment" : null}
<path>?(@.region != "ASIA") --> {"customer" : 100, "region" : "AFRICA"},
{"customer" : 300, "region" : "AFRICA", "comment" : null}
<path>?(!exists(@.customer)) --> {"region" : "ASIA"}
Следующие методы доступа вместе называются методами.
двойной()#
Преобразует числовые или текстовые значения в значения типа double.
<path>.double()
Позволять<path>вернуть последовательность-1, 23e4, "5.6":
<path>.double() --> -1e0, 23e4, 5.6e0
потолок(), пол() и абс()#
Получает верхний предел, нижний предел или абсолютное значение для каждого числового элемента в последовательность. Семантика операций такая же, как и в SQL.
Позволять<path>вернуть последовательность-1.5, -1, 1.3:
<path>.ceiling() --> -1.0, -1, 2.0
<path>.floor() --> -2.0, -1, 1.0
<path>.abs() --> 1.5, 1, 1.3
ключевое значение()#
Возвращает коллекцию объектов JSON, включая по одному объекту на каждый член исходный объект для каждого объекта JSON в последовательности.
<path>.keyvalue()
Возвращенные объекты имеют три члена:
«имя», которое является оригинальным ключом,
«значение», которое является исходным связанным значением,
«id», который представляет собой уникальный номер, специфичный для входного объекта.
Позволять<path>быть последовательностью трех объектов JSON:
{"customer" : 100, "region" : "AFRICA"},
{"region" : "ASIA"},
{"customer" : 300, "region" : "AFRICA", "comment" : null}
<path>.keyvalue() --> {"name" : "customer", "value" : 100, "id" : 0},
{"name" : "region", "value" : "AFRICA", "id" : 0},
{"name" : "region", "value" : "ASIA", "id" : 1},
{"name" : "customer", "value" : 300, "id" : 2},
{"name" : "region", "value" : "AFRICA", "id" : 2},
{"name" : "comment", "value" : null, "id" : 2}
Требуется, чтобы все элементы входной последовательности были объектами JSON.
Порядок возвращаемых значений соответствует порядку исходного JSON. объекты. Однако внутри объектов порядок возвращаемых записей произволен.
тип()#
Возвращает текстовое значение, содержащее имя типа для каждого элемента в последовательность.
<path>.type()
Этот метод не выполняет развертывание массива в слабом режиме.
Возвращаемые значения:
"null"для нулевого значения JSON,"number"для числового элемента,"string"для текстового элемента,"boolean"для логического элемента,"date"для элемента типа дата,"time without time zone"для элемента типа time,"time with time zone"для элемента типа время с часовым поясом,"timestamp without time zone"для элемента типа timestamp,"timestamp with time zone"для элемента типа timestamp с часовым поясом,"array"для массива JSON,"object"для объекта JSON,
размер()#
Возвращает числовое значение, содержащее размер каждого массива JSON в последовательность.
<path>.size()
Этот метод не выполняет развертывание массива в слабом режиме. Вместо этого все
элементы, не являющиеся массивами, упакованы в одноэлементные массивы JSON, поэтому их размер равен 1.
Требуется, чтобы все элементы входной последовательности представляли собой массивы JSON.
Позволять<path>вернуть последовательность из трех массивов JSON:
[0, 1, 2], ["a", "b", "c", "d"], [null, null]
<path>.size() --> 3, 4, 2
Ограничения#
Стандарт SQL описываетdatetime()Метод элемента пути JSON и метод
like_regex()Предикат пути JSON. Trino их не поддерживает.
Режимы пути JSON#
Выражение пути JSON можно оценить в двух режимах: строгом и нестрогом. В строгий режим, требуется, чтобы входные данные JSON строго соответствовали схеме требуется выражением пути. В нестрогом режиме входные данные JSON могут расходятся с ожидаемой схемой.
В следующей таблице показаны различия между этими двумя режимами.
Состояние |
строгий режим |
слабый режим |
|---|---|---|
Выполнение операции, для которой требуется немассив в массиве, например:
|
ОШИБКА |
Массив автоматически освобождается от вложенности, и операция выполняется над каждый элемент массива. |
Выполнение операции, требующей массива, не являющегося массивом, например:
|
ОШИБКА |
Элемент, не являющийся массивом, автоматически помещается в одноэлементный массив и операция выполняется над массивом. |
Структурная ошибка: обращение к несуществующему элементу массива или несуществующий член объекта JSON, например:
|
ОШИБКА |
Ошибка подавляется, и операция приводит к пустой последовательности. |
Примеры поведения в слабом режиме#
Позволять<path>вернуть последовательность из трех элементов, массив JSON, объект JSON,
и скалярное числовое значение:
[1, "a", null], {"key1" : 1.0, "key2" : true}, -2e3
В следующем примере показан метод доступа к массиву с подстановочными знаками в нестрогом режиме. Массив JSON возвращает все свои элементы, а объект JSON и число завернутые в одноэлементные массивы, а затем невложенные, поэтому они выглядят так эффективно без изменений в выходной последовательности:
<path>[*] --> 1, "a", null, {"key1" : 1.0, "key2" : true}, -2e3
При вызове size()метод, объект JSON и число также
завернутый в одноэлементные массивы:
<path>.size() --> 3, 1, 1
В некоторых случаях слабый режим не может предотвратить неудачу. В следующем примере
даже несмотря на то, что массив JSON разворачивается до вызова floor()
метод, предмет"a"вызывает несоответствие типов.
<path>.floor() --> ERROR
json_exists#
json_existsфункция определяет, соответствует ли значение JSON JSON
спецификация пути.
JSON_EXISTS(
json_input [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ],
json_path
[ PASSING json_argument [, ...] ]
[ { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ]
)
json_pathоценивается с помощьюjson_inputкак контекстная переменная
($), а переданные аргументы — как именованные переменные ($variable_name).
Возвращаемое значение trueесли путь возвращает непустую последовательность и
falseесли путь возвращает пустую последовательность. Если возникает ошибка,
возвращаемое значение зависит отON ERRORпункт. Возвращено значение по умолчанию
ON ERRORявляетсяFALSE.ON ERRORпункт применяется для следующих
виды ошибок:
Ошибки преобразования входных данных, например неверный формат JSON.
Ошибки оценки пути JSON, например. деление на ноль
json_inputпредставляет собой строку символов или двоичную строку. Он должен содержать
один элемент JSON. Для двоичной строки вы можете указать кодировку.
json_pathявляется строковым литералом, содержащим спецификацию режима пути, и
выражение пути, следуя правилам синтаксиса, описанным в
Синтаксис и семантика пути JSON.
'strict ($.price + $.tax)?(@ > 99.9)'
'lax $[0 to 1].floor()?(@ > 10)'
В PASSINGвы можете передавать произвольные выражения, которые будут использоваться
выражение пути.
PASSING orders.totalprice AS O_PRICE,
orders.tax % 10 AS O_TAX
На переданные параметры можно ссылаться в выражении пути по имени
переменные с префиксом $.
'lax $?(@.price > $O_PRICE || @.tax > $O_TAX)'
Помимо значений SQL вы можете передавать значения JSON, указывая формат и необязательная кодировка:
PASSING orders.json_desc FORMAT JSON AS o_desc,
orders.binary_record FORMAT JSON ENCODING UTF16 AS o_rec
Обратите внимание, что язык пути JSON чувствителен к регистру, а язык SQL без кавычек.
идентификаторы имеют верхний регистр. Поэтому рекомендуется использовать цитируемые
идентификаторы в PASSINGпункт:
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS KeyName --> ERROR; no passed value found
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS "KeyName" --> correct
Примеры#
Позволятьcustomersбыть таблицей, содержащей два столбца:id:bigint,
description:varchar.
идентификатор |
описание |
|---|---|
101 |
‘{“комментарий”: “мило”, “дети”: [10, 13, 16]}’ |
102 |
‘{“комментарий”: “проблемный”, “дети”: [8, 11]}’ |
103 |
‘{“комментарий”: “знает лучше всех”, “дети”: [2]}’ |
Следующий запрос проверяет, у каких клиентов есть дети старше 10 лет:
SELECT
id,
json_exists(
description,
'lax $.children[*]?(@ > 10)'
) AS children_above_ten
FROM customers
идентификатор |
Children_above_ten |
|---|---|
101 |
правда |
102 |
правда |
103 |
ложный |
В следующем запросе режим пути является строгим. Проверяем третьего ребенка на каждый клиент. Это должно вызвать структурную ошибку для клиентов, которые делают не иметь троих и более детей. Эта ошибка обрабатывается в соответствии с параметром `ON Предложение ОШИБКА.
SELECT
id,
json_exists(
description,
'strict $.children[2]?(@ > 10)'
UNKNOWN ON ERROR
) AS child_3_above_ten
FROM customers
идентификатор |
child_3_above_ten |
|---|---|
101 |
правда |
102 |
НУЛЬ |
103 |
НУЛЬ |
json_query#
json_queryФункция извлекает значение JSON из значения JSON.
JSON_QUERY(
json_input [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ],
json_path
[ PASSING json_argument [, ...] ]
[ RETURNING type [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ] ]
[ WITHOUT [ ARRAY ] WRAPPER |
WITH [ { CONDITIONAL | UNCONDITIONAL } ] [ ARRAY ] WRAPPER ]
[ { KEEP | OMIT } QUOTES [ ON SCALAR STRING ] ]
[ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON EMPTY ]
[ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON ERROR ]
)
Постоянная строка json_pathоценивается с помощьюjson_inputкак
контекстная переменная ($), а переданные аргументы как именованные переменные
($variable_name).
Возвращаемое значение — это элемент JSON, возвращаемый путем. По умолчанию это
представлено в виде строки символов (varchar). ВRETURNINGпункт,
вы можете указать другой тип символьной строки или varbinary. С
varbinary, вы также можете указать нужную кодировку.
json_inputпредставляет собой строку символов или двоичную строку. Он должен содержать
один элемент JSON. Для двоичной строки вы можете указать кодировку.
json_pathявляется строковым литералом, содержащим спецификацию режима пути, и
выражение пути, следуя правилам синтаксиса, описанным в
Синтаксис и семантика пути JSON.
'strict $.keyvalue()?(@.name == $cust_id)'
'lax $[5 to last]'
В PASSINGвы можете передавать произвольные выражения, которые будут использоваться
выражение пути.
PASSING orders.custkey AS CUST_ID
На переданные параметры можно ссылаться в выражении пути по имени
переменные с префиксом $.
'strict $.keyvalue()?(@.value == $CUST_ID)'
Помимо значений SQL вы можете передавать значения JSON, указывая формат и необязательная кодировка:
PASSING orders.json_desc FORMAT JSON AS o_desc,
orders.binary_record FORMAT JSON ENCODING UTF16 AS o_rec
Обратите внимание, что язык пути JSON чувствителен к регистру, а язык SQL без кавычек.
идентификаторы имеют верхний регистр. Поэтому рекомендуется использовать цитируемые
идентификаторы в PASSINGпункт:
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS KeyName --> ERROR; no passed value found
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS "KeyName" --> correct
ARRAY WRAPPERПредложение позволяет вам изменить вывод, обернув результаты
в массиве JSON.WITHOUT ARRAY WRAPPERэто опция по умолчанию. С CONDITIONAL ARRAY WRAPPER оборачивает каждый результат, который не является одноэлементным JSON.
массив или объект JSON.WITH UNCONDITIONAL ARRAY WRAPPERоборачивает каждый результат.
QUOTESПредложение позволяет вам изменить результат скалярной строки с помощью
удаление двойных кавычек, являющихся частью строкового представления JSON.
Примеры#
Позволятьcustomersбыть таблицей, содержащей два столбца:id:bigint,
description:varchar.
идентификатор |
описание |
|---|---|
101 |
‘{“комментарий”: “мило”, “дети”: [10, 13, 16]}’ |
102 |
‘{“комментарий”: “проблемный”, “дети”: [8, 11]}’ |
103 |
‘{“комментарий”: “знает лучше всех”, “дети”: [2]}’ |
Следующий запрос получаетchildrenмассив для каждого клиента:
SELECT
id,
json_query(
description,
'lax $.children'
) AS children
FROM customers
идентификатор |
дети |
|---|---|
101 |
‘[10,13,16]’ |
102 |
‘[8,11]’ |
103 |
‘[2]’ |
Следующий запрос получает коллекцию дочерних элементов для каждого клиента.
Обратите внимание, что json_queryфункция может выводить только один элемент JSON. Если
вы не используете оболочку массива, вы получаете ошибку для каждого клиента с несколькими
дети. Ошибка обрабатывается в соответствии с ON ERRORпункт.
SELECT
id,
json_query(
description,
'lax $.children[*]'
WITHOUT ARRAY WRAPPER
NULL ON ERROR
) AS children
FROM customers
идентификатор |
дети |
|---|---|
101 |
НУЛЬ |
102 |
НУЛЬ |
103 |
‘2’ |
Следующий запрос получает последнего дочернего элемента для каждого клиента, завернутого в JSON. множество:
SELECT
id,
json_query(
description,
'lax $.children[last]'
WITH ARRAY WRAPPER
) AS last_child
FROM customers
идентификатор |
последний_ребенок |
|---|---|
101 |
‘[16]’ |
102 |
‘[11]’ |
103 |
‘[2]’ |
Следующий запрос возвращает всех детей старше 12 лет для каждого клиента.
завернутый в массив JSON. У второго и третьего клиента нет детей.
этого возраста. Такой случай рассматривается в соответствии с п.ON EMPTYпункт.
возвращено значение по умолчаниюON EMPTYявляетсяNULL. В следующем примере
EMPTY ARRAY ON EMPTYуказано.
SELECT
id,
json_query(
description,
'strict $.children[*]?(@ > 12)'
WITH ARRAY WRAPPER
EMPTY ARRAY ON EMPTY
) AS children
FROM customers
идентификатор |
дети |
|---|---|
101 |
‘[13,16]’ |
102 |
‘[]’ |
103 |
‘[]’ |
Следующий запрос показывает результатQUOTESпункт. Обратите внимание, что ДЕРЖАТЬ QUOTES используется по умолчанию.
SELECT
id,
json_query(description, 'strict $.comment' KEEP QUOTES) AS quoted_comment,
json_query(description, 'strict $.comment' OMIT QUOTES) AS unquoted_comment
FROM customers
идентификатор |
цитируемый_комментарий |
нецитируемый_комментарий |
|---|---|---|
101 |
‘’хороший’’ |
‘хороший’ |
102 |
‘’проблемный’’ |
‘проблемный’ |
103 |
«знает лучше» |
«знает лучше» |
В случае возникновения ошибки возвращаемое значение зависит отON ERRORпункт.
возвращено значение по умолчаниюON ERRORявляетсяNULL. Одним из примеров ошибки является
несколько элементов, возвращаемых по пути. Другие ошибки обнаруживаются и обрабатываются в соответствии с
к ON ERRORпункт:
Ошибки преобразования входных данных, например неверный формат JSON.
Ошибки оценки пути JSON, например. деление на ноль
Ошибки преобразования вывода
json_value#
json_valueФункция извлекает скалярное значение SQL из значения JSON.
JSON_VALUE(
json_input [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ],
json_path
[ PASSING json_argument [, ...] ]
[ RETURNING type ]
[ { ERROR | NULL | DEFAULT expression } ON EMPTY ]
[ { ERROR | NULL | DEFAULT expression } ON ERROR ]
)
json_pathоценивается с помощьюjson_inputкак контекстная переменная
($), а переданные аргументы — как именованные переменные ($variable_name).
Возвращаемое значение — это скаляр SQL, возвращаемый путем. По умолчанию это
преобразовано в строку (varchar). ВRETURNINGпункт, вы можете указать
другой желаемый тип: тип символьной строки, числовой, логический или тип даты и времени.
json_inputпредставляет собой строку символов или двоичную строку. Он должен содержать
один элемент JSON. Для двоичной строки вы можете указать кодировку.
json_pathявляется строковым литералом, содержащим спецификацию режима пути, и
выражение пути, следуя правилам синтаксиса, описанным в
Синтаксис и семантика пути JSON.
'strict $.price + $tax'
'lax $[last].abs().floor()'
В PASSINGвы можете передавать произвольные выражения, которые будут использоваться
выражение пути.
PASSING orders.tax AS O_TAX
На переданные параметры можно ссылаться в выражении пути по имени
переменные с префиксом $.
'strict $[last].price + $O_TAX'
Помимо значений SQL вы можете передавать значения JSON, указывая формат и необязательная кодировка:
PASSING orders.json_desc FORMAT JSON AS o_desc,
orders.binary_record FORMAT JSON ENCODING UTF16 AS o_rec
Обратите внимание, что язык пути JSON чувствителен к регистру, а язык SQL без кавычек.
идентификаторы имеют верхний регистр. Поэтому рекомендуется использовать цитируемые
идентификаторы в PASSINGпункт:
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS KeyName --> ERROR; no passed value found
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS "KeyName" --> correct
Если путь возвращает пустую последовательность,ON EMPTYприменяется оговорка.
возвращено значение по умолчаниюON EMPTYявляетсяNULL. Вы также можете указать
значение по умолчанию:
DEFAULT -1 ON EMPTY
В случае возникновения ошибки возвращаемое значение зависит отON ERRORпункт.
возвращено значение по умолчаниюON ERRORявляетсяNULL. Одним из примеров ошибки является
несколько элементов, возвращаемых по пути. Другие ошибки обнаруживаются и обрабатываются в соответствии с
к ON ERRORпункт:
Ошибки преобразования входных данных, например неверный формат JSON.
Ошибки оценки пути JSON, например. деление на ноль
Возвращенный скаляр, не конвертируемый в нужный тип.
Примеры#
Позволятьcustomersбыть таблицей, содержащей два столбца:id:bigint,
description:varchar.
идентификатор |
описание |
|---|---|
101 |
‘{“комментарий”: “мило”, “дети”: [10, 13, 16]}’ |
102 |
‘{“комментарий”: “проблемный”, “дети”: [8, 11]}’ |
103 |
‘{“комментарий”: “знает лучше всех”, “дети”: [2]}’ |
Следующий запрос получаетcommentдля каждого клиента какchar(12):
SELECT id, json_value(
description,
'lax $.comment'
RETURNING char(12)
) AS comment
FROM customers
идентификатор |
комментарий |
|---|---|
101 |
‘хороший’ |
102 |
‘проблемный’ |
103 |
‘знает лучше’ |
Следующий запрос получает возраст первого ребенка для каждого клиента как
tinyint:
SELECT id, json_value(
description,
'lax $.children[0]'
RETURNING tinyint
) AS child
FROM customers
идентификатор |
ребенок |
|---|---|
101 |
10 |
102 |
8 |
103 |
2 |
Следующий запрос позволяет получить возраст третьего ребенка для каждого клиента. В строгом
режиме, это должно вызвать структурную ошибку для клиентов, у которых нет
третий ребенок. Эта ошибка обрабатывается в соответствии с ON ERRORпункт.
SELECT id, json_value(
description,
'strict $.children[2]'
DEFAULT 'err' ON ERROR
) AS child
FROM customers
идентификатор |
ребенок |
|---|---|
101 |
‘16’ |
102 |
‘ошибиться’ |
103 |
‘ошибиться’ |
После изменения режима на слабый структурная ошибка подавляется, и
клиенты без третьего дочернего элемента выдают пустую последовательность. Этот случай рассматривается
согласно ON EMPTYпункт.
SELECT id, json_value(
description,
'lax $.children[2]'
DEFAULT 'missing' ON EMPTY
) AS child
FROM customers
идентификатор |
ребенок |
|---|---|
101 |
‘16’ |
102 |
‘пропал без вести’ |
103 |
‘пропал без вести’ |
json_table#
json_tableПредложение извлекает таблицу из значения JSON. Используйте этот пункт, чтобы
преобразовывать данные JSON в реляционный формат, упрощая запросы и
анализировать. Использоватьjson_tableвFROMпункт
SELECT для создания таблицы из данных JSON.
JSON_TABLE(
json_input,
json_path [ AS path_name ]
[ PASSING value AS parameter_name [, ...] ]
COLUMNS (
column_definition [, ...] )
[ PLAN ( json_table_specific_plan )
| PLAN DEFAULT ( json_table_default_plan ) ]
[ { ERROR | EMPTY } ON ERROR ]
)
COLUMNSпредложение поддерживает следующееcolumn_definitionаргументы:
column_name FOR ORDINALITY
| column_name type
[ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ]
[ PATH json_path ]
[ { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } [ ARRAY ] WRAPPER ]
[ { KEEP | OMIT } QUOTES [ ON SCALAR STRING ] ]
[ { ERROR | NULL | EMPTY { [ARRAY] | OBJECT } | DEFAULT expression } ON EMPTY ]
[ { ERROR | NULL | DEFAULT expression } ON ERROR ]
| NESTED [ PATH ] json_path [ AS path_name ] COLUMNS ( column_definition [, ...] )
json_inputпредставляет собой строку символов или двоичную строку. Он должен содержать один
Элемент JSON.
json_pathстроковый литерал, содержащий спецификацию режима пути и
выражение пути. Он следует синтаксическим правилам, описанным в
Синтаксис и семантика пути JSON.
'strict ($.price + $.tax)?(@ > 99.9)'
'lax $[0 to 1].floor()?(@ > 10)'
В PASSINGпредложение, передавать значения как именованные параметры, которыеjson_path
выражение может ссылаться.
PASSING orders.totalprice AS o_price,
orders.tax % 10 AS o_tax
Используйте именованные параметры для ссылки на значения в выражении пути. Префикс
именованные параметры с $.
'lax $?(@.price > $o_price || @.tax > $o_tax)'
Вы также можете передать значения JSON в PASSINGпункт. ИспользоватьFORMAT JSONк
укажите формат и ENCODINGуказать кодировку:
PASSING orders.json_desc FORMAT JSON AS o_desc,
orders.binary_record FORMAT JSON ENCODING UTF16 AS o_rec
json_pathзначение чувствительно к регистру. Идентификаторы SQL указаны в верхнем регистре. Использовать
цитируемые идентификаторы в PASSINGпункт:
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS KeyName --> ERROR; no passed value found
'lax $.keyvalue()?(@.name == $KeyName).value' PASSING nation.name AS "KeyName" --> correct
PLANПредложение определяет, как объединять столбцы из разных путей. Использовать
OUTERилиINNERчтобы определить, как объединить родительские пути с их дочерними путями.
ИспользоватьCROSSилиUNIONприсоединиться к братьям и сестрам.
COLUMNSопределяет схему вашей таблицы. Каждыйcolumn_definitionуказывает
как извлечь и отформатироватьjson_inputзначение в реляционный столбец.
PLAN— это необязательное предложение, позволяющее контролировать обработку и объединение вложенных JSON.
данные.
ON ERRORопределяет, как обрабатывать ошибки обработки.ERROR ON ERRORбросает
ошибка.EMPTY ON ERRORвозвращает пустой набор результатов.
column_nameуказывает имя столбца.
FOR ORDINALITYдобавляет столбец с номером строки в выходную таблицу, начиная с1.
Укажите имя столбца в определении столбца:
row_num FOR ORDINALITY
NESTED PATHизвлекает данные из вложенных уровнейjson_inputценить. Каждый
NESTED PATHпункт может содержатьcolumn_definitionценности.
json_tableфункция возвращает набор результатов, который вы можете использовать как любой другой
table в ваших запросах. Вы можете объединить набор результатов с другими таблицами или
объедините несколько массивов из ваших данных JSON.
Вы также можете обрабатывать вложенные объекты JSON без анализа нескольких данных. раз.
Использоватьjson_tableкак боковое соединение для обработки данных JSON из другой таблицы.
Примеры#
Следующий запрос используетjson_tableдля извлечения значений из массива JSON и
верните их как строки в таблице с тремя столбцами:
SELECT
*
FROM
json_table(
'[
{"id":1,"name":"Africa","wikiDataId":"Q15"},
{"id":2,"name":"Americas","wikiDataId":"Q828"},
{"id":3,"name":"Asia","wikiDataId":"Q48"},
{"id":4,"name":"Europe","wikiDataId":"Q51"}
]',
'strict $' COLUMNS (
NESTED PATH 'strict $[*]' COLUMNS (
id integer PATH 'strict $.id',
name varchar PATH 'strict $.name',
wiki_data_id varchar PATH 'strict $."wikiDataId"'
)
)
);
идентификатор |
ребенок |
wiki_data_id |
|---|---|---|
1 |
Африка |
1 квартал |
2 |
Америка |
Q828 |
3 |
Азия |
Q48 |
4 |
Европа |
В51 |
Следующий запрос используетjson_tableдля извлечения значений из массива вложенных
JSON-объекты. Он объединяет вложенные данные JSON в одну таблицу. Пример
запрос обрабатывает массив названий континентов, где каждый континент содержит
множество стран и их населения.
NESTED PATH 'lax $[*]'предложение перебирает объекты континента,
в то время как NESTED PATH 'lax $.countries[*]'повторяется по каждой стране
внутри каждого континента. Это создает плоскую структуру таблицы с четырьмя строками.
объединяя каждый континент с каждой из своих стран. Ценности континента повторяются
каждой из своих стран.
SELECT
*
FROM
json_table(
'[
{"continent": "Asia", "countries": [
{"name": "Japan", "population": 125.7},
{"name": "Thailand", "population": 71.6}
]},
{"continent": "Europe", "countries": [
{"name": "France", "population": 67.4},
{"name": "Germany", "population": 83.2}
]}
]',
'lax $' COLUMNS (
NESTED PATH 'lax $[*]' COLUMNS (
continent varchar PATH 'lax $.continent',
NESTED PATH 'lax $.countries[*]' COLUMNS (
country varchar PATH 'lax $.name',
population double PATH 'lax $.population'
)
)
));
континент |
страна |
население |
|---|---|---|
Азия |
Япония |
125,7 |
Азия |
Таиланд |
71,6 |
Европа |
Франция |
67,4 |
Европа |
Германия |
83,2 |
Следующий запрос используетPLANуказатьOUTERобъединить родительский путь
и дочерний путь:
SELECT
*
FROM
JSON_TABLE(
'[]',
'lax $' AS "root_path"
COLUMNS(
a varchar(1) PATH 'lax "A"',
NESTED PATH 'lax $[*]' AS "nested_path"
COLUMNS (b varchar(1) PATH 'lax "B"'))
PLAN ("root_path" OUTER "nested_path")
);
а |
б |
|---|---|
А |
ноль |
Следующий запрос используетPLANуказатьINNERобъединить родительский путь
и дочерний путь:
SELECT
*
FROM
JSON_TABLE(
'[]',
'lax $' AS "root_path"
COLUMNS(
a varchar(1) PATH 'lax "A"',
NESTED PATH 'lax $[*]' AS "nested_path"
COLUMNS (b varchar(1) PATH 'lax "B"'))
PLAN ("root_path" INNER "nested_path")
);
а |
б |
|---|---|
ноль |
ноль |
json_array#
json_arrayФункция создает массив JSON, содержащий заданные элементы.
JSON_ARRAY(
[ array_element [, ...]
[ { NULL ON NULL | ABSENT ON NULL } ] ],
[ RETURNING type [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ] ]
)
Типы аргументов#
Элементами массива могут быть произвольные выражения. Каждое переданное значение преобразуется
в элемент JSON в соответствии с его типом и необязательно FORMATи
ENCODINGспецификация.
Вы можете передавать значения SQL логических, числовых и символьных строк. Они преобразуются в соответствующие литералы JSON:
SELECT json_array(true, 12e-1, 'text')
--> '[true,1.2,"text"]'
Помимо значений SQL вы можете передавать значения JSON. Они характерны или двоичные строки с указанным форматом и необязательной кодировкой:
SELECT json_array(
'[ "text" ] ' FORMAT JSON,
X'5B0035005D00' FORMAT JSON ENCODING UTF16
)
--> '[["text"],[5]]'
Вы также можете вложить другие функции, возвращающие JSON. В этом случае FORMAT
опция неявная:
SELECT json_array(
json_query('{"key" : [ "value" ]}', 'lax $.key')
)
--> '[["value"]]'
Другие переданные значения преобразуются в varchar и становятся текстовыми литералами JSON:
SELECT json_array(
DATE '2001-01-31',
UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'
)
--> '["2001-01-31","12151fd2-7586-11e9-8f9e-2a86e4085a59"]'
Вы можете вообще опустить аргументы, чтобы получить пустой массив:
SELECT json_array() --> '[]'
Обработка нуля#
Если значение, переданное для элемента массива, равно null, это рассматривается в соответствии с
указанный вариант обработки нуля. Если ABSENT ON NULLуказано,
нулевой элемент в результате опущен. Если NULL ON NULLуказано, JSON
nullдобавляется к результату.ABSENT ON NULLэто значение по умолчанию
конфигурация:
SELECT json_array(true, null, 1)
--> '[true,1]'
SELECT json_array(true, null, 1 ABSENT ON NULL)
--> '[true,1]'
SELECT json_array(true, null, 1 NULL ON NULL)
--> '[true,null,1]'
Возвращаемый тип#
Стандарт SQL требует, чтобы не было специального типа данных для представления JSON.
данные в SQL. Вместо этого данные JSON представлены в виде символьных или двоичных строк.
По умолчаниюjson_arrayфункция возвращает varchar, содержащий текстовый
представление массива JSON. С RETURNINGпункт, вы можете
укажите другой тип символьной строки:
SELECT json_array(true, 1 RETURNING VARCHAR(100))
--> '[true,1]'
Вы также можете указать использование varbinary и требуемой кодировки в качестве типа возвращаемого значения. Кодировка по умолчанию — UTF8:
SELECT json_array(true, 1 RETURNING VARBINARY)
--> X'5b 74 72 75 65 2c 31 5d'
SELECT json_array(true, 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF8)
--> X'5b 74 72 75 65 2c 31 5d'
SELECT json_array(true, 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF16)
--> X'5b 00 74 00 72 00 75 00 65 00 2c 00 31 00 5d 00'
SELECT json_array(true, 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF32)
--> X'5b 00 00 00 74 00 00 00 72 00 00 00 75 00 00 00 65 00 00 00 2c 00 00 00 31 00 00 00 5d 00 00 00'
json_object#
json_objectФункция создает объект JSON, содержащий заданные пары ключ-значение.
JSON_OBJECT(
[ key_value [, ...]
[ { NULL ON NULL | ABSENT ON NULL } ] ],
[ { WITH UNIQUE [ KEYS ] | WITHOUT UNIQUE [ KEYS ] } ]
[ RETURNING type [ FORMAT JSON [ ENCODING { UTF8 | UTF16 | UTF32 } ] ] ]
)
Соглашения о передаче аргументов#
Существует два соглашения для передачи ключей и значений:
SELECT json_object('key1' : 1, 'key2' : true)
--> '{"key1":1,"key2":true}'
SELECT json_object(KEY 'key1' VALUE 1, KEY 'key2' VALUE true)
--> '{"key1":1,"key2":true}'
Во втором соглашении вы можете опуститьKEYключевое слово:
SELECT json_object('key1' VALUE 1, 'key2' VALUE true)
--> '{"key1":1,"key2":true}'
Типы аргументов#
Ключами могут быть произвольные выражения. Они должны иметь тип символьной строки. Каждый ключ преобразуется в текстовый элемент JSON и становится ключом в создал объект JSON. Ключи не должны быть нулевыми.
Значения могут быть произвольными выражениями. Каждое переданное значение преобразуется
в элемент JSON в соответствии с его типом и необязательно FORMATи
ENCODINGспецификация.
Вы можете передавать значения SQL логических, числовых и символьных строк. Они преобразуются в соответствующие литералы JSON:
SELECT json_object('x' : true, 'y' : 12e-1, 'z' : 'text')
--> '{"x":true,"y":1.2,"z":"text"}'
Помимо значений SQL вы можете передавать значения JSON. Они характерны или двоичные строки с указанным форматом и необязательной кодировкой:
SELECT json_object(
'x' : '[ "text" ] ' FORMAT JSON,
'y' : X'5B0035005D00' FORMAT JSON ENCODING UTF16
)
--> '{"x":["text"],"y":[5]}'
Вы также можете вложить другие функции, возвращающие JSON. В этом случае FORMAT
опция неявная:
SELECT json_object(
'x' : json_query('{"key" : [ "value" ]}', 'lax $.key')
)
--> '{"x":["value"]}'
Другие переданные значения преобразуются в varchar и становятся текстовыми литералами JSON:
SELECT json_object(
'x' : DATE '2001-01-31',
'y' : UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'
)
--> '{"x":"2001-01-31","y":"12151fd2-7586-11e9-8f9e-2a86e4085a59"}'
Вы можете вообще опустить аргументы, чтобы получить пустой объект:
SELECT json_object() --> '{}'
Обработка нуля#
Значения, передаваемые для ключей объекта JSON, не должны быть нулевыми. Разрешено пройти
nullдля значений объекта JSON. Нулевое значение обрабатывается в соответствии с
указанный вариант нулевой обработки. Если NULL ON NULLуказан JSON
запись объекта с помощьюnullзначение добавляется к результату. ЕслиABSENT ON NULL
указан, запись в результате опускается.NULL ON NULLэто
конфигурация по умолчанию.:
SELECT json_object('x' : null, 'y' : 1)
--> '{"x":null,"y":1}'
SELECT json_object('x' : null, 'y' : 1 NULL ON NULL)
--> '{"x":null,"y":1}'
SELECT json_object('x' : null, 'y' : 1 ABSENT ON NULL)
--> '{"y":1}'
Ключевая уникальность#
Если встречается дубликат ключа, он обрабатывается в соответствии с указанным ключом. ограничение уникальности.
Если WITH UNIQUE KEYSуказан, дублирующийся ключ приводит к запросу
отказ:
SELECT json_object('x' : null, 'x' : 1 WITH UNIQUE KEYS)
--> failure: "duplicate key passed to JSON_OBJECT function"
Обратите внимание, что эта опция не поддерживается, если какой-либо из аргументов имеет
FORMATспецификация.
Если WITHOUT UNIQUE KEYSуказан, дубликаты ключей не поддерживаются из-за
к ограничению реализации.WITHOUT UNIQUE KEYSэто значение по умолчанию
конфигурация.
Возвращаемый тип#
Стандарт SQL требует, чтобы не было специального типа данных для представления JSON.
данные в SQL. Вместо этого данные JSON представлены в виде символьных или двоичных строк.
По умолчаниюjson_objectфункция возвращает varchar, содержащий текстовый
представление объекта JSON. С RETURNINGпункт, вы можете
укажите другой тип символьной строки:
SELECT json_object('x' : 1 RETURNING VARCHAR(100))
--> '{"x":1}'
Вы также можете указать использование varbinary и требуемой кодировки в качестве типа возвращаемого значения. Кодировка по умолчанию — UTF8:
SELECT json_object('x' : 1 RETURNING VARBINARY)
--> X'7b 22 78 22 3a 31 7d'
SELECT json_object('x' : 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF8)
--> X'7b 22 78 22 3a 31 7d'
SELECT json_object('x' : 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF16)
--> X'7b 00 22 00 78 00 22 00 3a 00 31 00 7d 00'
SELECT json_object('x' : 1 RETURNING VARBINARY FORMAT JSON ENCODING UTF32)
--> X'7b 00 00 00 22 00 00 00 78 00 00 00 22 00 00 00 3a 00 00 00 31 00 00 00 7d 00 00 00'
Warning
Следующие функции и операторы не совместимы с SQL.
стандарт, и его следует считать устаревшим. По данным SQL
стандарт, не должно бытьJSONтип данных. Вместо этого значения JSON
должны быть представлены в виде строковых значений. Остальной функционал
Следующие функции охватываются функциями, описанными ранее.
Преобразование в JSON#
К JSON можно преобразовать следующие типы:
BOOLEANTINYINTSMALLINTINTEGERBIGINTREALDOUBLEVARCHAR
Кроме того,ARRAY, MAP, иROWтипы могут быть преобразованы в JSON, когда
выполняются следующие требования:
ARRAYтипы могут быть приведены, если тип элемента массива равен единице поддерживаемых типов.MAPтипы могут быть приведены, когда ключевой тип картыVARCHARи тип значения карты является поддерживаемым типом,ROWтипы могут быть приведены, если каждый тип поля строки поддерживается тип.
Note
Операции приведения с поддерживаемыми типами символьных строк обрабатывает входные данные как строку, а не как JSON. Это означает, что операция приведения со строковым вводом недопустимого JSON приводит к успешному приведению к недопустимому JSON.
Вместо этого рассмотрите возможность использования json_parse()функционировать, чтобы
создать проверенный JSON из строки.
В следующих примерах показано поведение приведения к JSON с этими типами:
SELECT CAST(NULL AS JSON);
-- NULL
SELECT CAST(1 AS JSON);
-- JSON '1'
SELECT CAST(9223372036854775807 AS JSON);
-- JSON '9223372036854775807'
SELECT CAST('abc' AS JSON);
-- JSON '"abc"'
SELECT CAST(true AS JSON);
-- JSON 'true'
SELECT CAST(1.234 AS JSON);
-- JSON '1.234'
SELECT CAST(ARRAY[1, 23, 456] AS JSON);
-- JSON '[1,23,456]'
SELECT CAST(ARRAY[1, NULL, 456] AS JSON);
-- JSON '[1,null,456]'
SELECT CAST(ARRAY[ARRAY[1, 23], ARRAY[456]] AS JSON);
-- JSON '[[1,23],[456]]'
SELECT CAST(MAP(ARRAY['k1', 'k2', 'k3'], ARRAY[1, 23, 456]) AS JSON);
-- JSON '{"k1":1,"k2":23,"k3":456}'
SELECT CAST(CAST(ROW(123, 'abc', true) AS
ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN)) AS JSON);
-- JSON '{"v1":123,"v2":"abc","v3":true}'
Приведение от NULL к JSONне является простым. Кастинг
из автономного NULLбудет производить SQLNULLвместо
JSON 'null'. Однако при приведении из массивов или карты, содержащей
NULLs, произведенныйJSONбудет иметьnullв этом.
Трансляция из JSON#
Кастинг в BOOLEAN,TINYINT,SMALLINT,INTEGER,
BIGINT, REAL, DOUBLEилиVARCHARподдерживается.
Кастинг в ARRAYиMAPподдерживается, когда тип элемента
массив является одним из поддерживаемых типов или когда тип ключа карты
является VARCHARи тип значения карты является одним из поддерживаемых типов.
Поведение приведений показано на примерах ниже:
SELECT CAST(JSON 'null' AS VARCHAR);
-- NULL
SELECT CAST(JSON '1' AS INTEGER);
-- 1
SELECT CAST(JSON '9223372036854775807' AS BIGINT);
-- 9223372036854775807
SELECT CAST(JSON '"abc"' AS VARCHAR);
-- abc
SELECT CAST(JSON 'true' AS BOOLEAN);
-- true
SELECT CAST(JSON '1.234' AS DOUBLE);
-- 1.234
SELECT CAST(JSON '[1,23,456]' AS ARRAY(INTEGER));
-- [1, 23, 456]
SELECT CAST(JSON '[1,null,456]' AS ARRAY(INTEGER));
-- [1, NULL, 456]
SELECT CAST(JSON '[[1,23],[456]]' AS ARRAY(ARRAY(INTEGER)));
-- [[1, 23], [456]]
SELECT CAST(JSON '{"k1":1,"k2":23,"k3":456}' AS MAP(VARCHAR, INTEGER));
-- {k1=1, k2=23, k3=456}
SELECT CAST(JSON '{"v1":123,"v2":"abc","v3":true}' AS
ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN));
-- {v1=123, v2=abc, v3=true}
SELECT CAST(JSON '[123,"abc",true]' AS
ROW(v1 BIGINT, v2 VARCHAR, v3 BOOLEAN));
-- {v1=123, v2=abc, v3=true}
Массивы JSON могут иметь смешанные типы элементов, а карты JSON могут иметь смешанные типы. типы значений. Это делает невозможным их приведение к массивам и картам SQL в некоторые случаи. Чтобы решить эту проблему, Trino поддерживает частичное приведение массивов и карт:
SELECT CAST(JSON '[[1, 23], 456]' AS ARRAY(JSON));
-- [JSON '[1,23]', JSON '456']
SELECT CAST(JSON '{"k1": [1, 23], "k2": 456}' AS MAP(VARCHAR, JSON));
-- {k1 = JSON '[1,23]', k2 = JSON '456'}
SELECT CAST(JSON '[null]' AS ARRAY(JSON));
-- [JSON 'null']
При кастинге из JSONкROW, поддерживаются как массив JSON, так и объект JSON.
Другие функции JSON#
В дополнение к функциям, более подробно описанным в предыдущем разделах доступны следующие функции:
- is_json_scalar(json) boolean#
Определите, если
jsonявляется скаляром (т. е. числом JSON, строкой JSON,true,falseилиnull):SELECT is_json_scalar('1'); -- true SELECT is_json_scalar('[1, 2, 3]'); -- false
- json_array_contains(json, value) boolean#
Определите, если
valueсуществует вjson(строка, содержащая массив JSON):SELECT json_array_contains('[1, 2, 3]', 2); -- true
- json_array_get(json_array, index) json#
Warning
Семантика этой функции нарушена. Если извлеченный элемент это строка, она будет преобразована в недействительную
JSONценю это не заключено в кавычки (значение не будет заключено в кавычки) и любые внутренние кавычки не будут экранированы).Мы не рекомендуем использовать эту функцию. Это невозможно исправить без влияет на существующие способы использования и может быть удалена в будущем выпуске.
Возвращает элемент по указанному индексу в
json_array. Индекс отсчитывается от нуля:SELECT json_array_get('["a", [3, 9], "c"]', 0); -- JSON 'a' (invalid JSON) SELECT json_array_get('["a", [3, 9], "c"]', 1); -- JSON '[3,9]'
Эта функция также поддерживает отрицательные индексы для получения индексированных элементов. с конца массива:
SELECT json_array_get('["c", [3, 9], "a"]', -1); -- JSON 'a' (invalid JSON) SELECT json_array_get('["c", [3, 9], "a"]', -2); -- JSON '[3,9]'
Если элемент по указанному индексу не существует, функция возвращает значение null:
SELECT json_array_get('[]', 0); -- NULL SELECT json_array_get('["a", "b", "c"]', 10); -- NULL SELECT json_array_get('["c", "b", "a"]', -10); -- NULL
- json_array_length(json) bigint#
Возвращает длину массива
json(строка, содержащая массив JSON):SELECT json_array_length('[1, 2, 3]'); -- 3
- json_extract(json, json_path) json#
Оценивает выражение типа JSONPath
json_pathнаjson(строка, содержащая JSON) и возвращает результат в виде строки JSON:SELECT json_extract(json, '$.store.book'); SELECT json_extract(json, '$.store[book]'); SELECT json_extract(json, '$.store["book name"]');
json_query functionобеспечивает более мощный и многофункциональная альтернатива анализу и извлечению данных JSON.
- json_extract_scalar(json, json_path) varchar#
Нравится {функ}
json_extract, но возвращает значение результата в виде строки (в отличие от чтобы быть закодированным как JSON). Значение, на которое ссылаетсяjson_pathдолжно быть скаляр (логическое значение, число или строка).SELECT json_extract_scalar('[1, 2, 3]', '$[2]'); SELECT json_extract_scalar(json, '$.store.book[0].author');
- json_format(json) varchar#
Возвращает текст JSON, сериализованный из входного значения JSON. Это обратная функция к {func}.
json_parse.SELECT json_format(JSON '[1, 2, 3]'); -- '[1,2,3]' SELECT json_format(JSON '"a"'); -- '"a"'
Note
json_format()иCAST(json AS VARCHAR)полностью разная семантика.json_format()сериализует входное значение JSON в текст JSON, соответствующий RFC 7159. Значением JSON может быть объект JSON, массив JSON, строка JSON, номер JSON,true,falseилиnull.SELECT json_format(JSON '{"a": 1, "b": 2}'); -- '{"a":1,"b":2}' SELECT json_format(JSON '[1, 2, 3]'); -- '[1,2,3]' SELECT json_format(JSON '"abc"'); -- '"abc"' SELECT json_format(JSON '42'); -- '42' SELECT json_format(JSON 'true'); -- 'true' SELECT json_format(JSON 'null'); -- 'null'
CAST(json AS VARCHAR)преобразует значение JSON в соответствующее значение SQL VARCHAR. Для строки JSON номер JSON,true,falseилиnull, актерский состав поведение такое же, как и у соответствующего типа SQL. Объект JSON и массив JSON невозможно привести к VARCHAR.SELECT CAST(JSON '{"a": 1, "b": 2}' AS VARCHAR); -- ERROR! SELECT CAST(JSON '[1, 2, 3]' AS VARCHAR); -- ERROR! SELECT CAST(JSON '"abc"' AS VARCHAR); -- 'abc' (the double quote is gone) SELECT CAST(JSON '42' AS VARCHAR); -- '42' SELECT CAST(JSON 'true' AS VARCHAR); -- 'true' SELECT CAST(JSON 'null' AS VARCHAR); -- NULL
- json_parse(string) json#
Возвращает значение JSON, десериализованное из входного текста JSON. Это обратная функция к {func}.
json_format:SELECT json_parse('[1, 2, 3]'); -- JSON '[1,2,3]' SELECT json_parse('"abc"'); -- JSON '"abc"'
Note
json_parse()иCAST(string AS JSON)полностью разная семантика.json_parse()ожидает текст JSON, соответствующий RFC 7159и возвращает значение JSON, десериализованное из текста JSON. Значением JSON может быть объект JSON, массив JSON, строка JSON, номер JSON,true,falseилиnull.SELECT json_parse('not_json'); -- ERROR! SELECT json_parse('["a": 1, "b": 2]'); -- JSON '["a": 1, "b": 2]' SELECT json_parse('[1, 2, 3]'); -- JSON '[1,2,3]' SELECT json_parse('"abc"'); -- JSON '"abc"' SELECT json_parse('42'); -- JSON '42' SELECT json_parse('true'); -- JSON 'true' SELECT json_parse('null'); -- JSON 'null'
CAST(string AS JSON)принимает любое значение VARCHAR в качестве входных данных и возвращает строка JSON со значением, установленным для входной строки.SELECT CAST('not_json' AS JSON); -- JSON '"not_json"' SELECT CAST('["a": 1, "b": 2]' AS JSON); -- JSON '"[\"a\": 1, \"b\": 2]"' SELECT CAST('[1, 2, 3]' AS JSON); -- JSON '"[1, 2, 3]"' SELECT CAST('"abc"' AS JSON); -- JSON '"\"abc\""' SELECT CAST('42' AS JSON); -- JSON '"42"' SELECT CAST('true' AS JSON); -- JSON '"true"' SELECT CAST('null' AS JSON); -- JSON '"null"'
- json_size(json, json_path) bigint#
Нравится {функ}
json_extract, но возвращает размер значения. Для объектов или массивов размер — это количество членов, а размер скалярного значения равен нулю.SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x'); -- 2 SELECT json_size('{"x": [1, 2, 3]}', '$.x'); -- 3 SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a'); -- 0