JSON_OBJECT
Описание
Формирует один объект JSON, содержащий указанные пары «ключ-значение». Возвращает ошибку, если ключ имеет значение NULL или передано нечётное число параметров.
Синтаксис
JSON_OBJECT (<key>, <value>[, <key>, <value>, ...])
JSON_OBJECT(*)
Параметры
Переменное число параметров:
-
<key>: тип String. -
<value>: различные типы; Doris автоматически преобразует параметры типов, отличных от JSON, в тип JSON с помощью функцииTO_JSON. -
*: при вызове со звёздочкой (подстановочным символом) значение OBJECT формируется из указанных данных: имена атрибутов используются в качестве ключей, а соответствующие значения используются в качестве значений объекта.При передаче подстановочного символа в функцию можно указать перед ним имя или псевдоним таблицы. Например, чтобы передать все столбцы таблицы с именем mytable, укажите следующее:
(mytable.*)
Примечания
- Число параметров должно быть чётным; допускается 0 параметров (возвращается пустой объект JSON).
- По соглашению список параметров состоит из чередующихся ключей и значений.
- Ключи принудительно преобразуются в текст в соответствии с определением JSON.
- Если переданный ключ имеет значение NULL, возникает ошибка исключения.
- Параметры значений преобразуются в JSON и должны иметь типы, поддерживаемые
TO_JSON. - Если переданное значение равно NULL, значением соответствующей пары «ключ-значение» в возвращаемом объекте JSON будет значение JSON null.
- Чтобы использовать в качестве значений другие типы, можно преобразовать их в JSON/String с помощью CAST.
- В настоящее время Doris не выполняет дедупликацию объектов JSON, поэтому повторяющиеся ключи допускаются. Однако повторяющиеся ключи могут приводить к неожиданным результатам:
- Другие системы могут отбрасывать значения, соответствующие повторяющимся ключам, или сообщать об ошибках.
- Результат, возвращаемый
JSON_EXTRACT, не определён.
Возвращаемое значение
JSON: возвращает объект JSON, сформированный из списка параметров.
Примеры
-
Пример без параметров
select json_object();+---------------+
| json_object() |
+---------------+
| {} |
+---------------+ -
Неподдерживаемые типы значений
select json_object('time',curtime());ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: to_json(TIMEV2(0))Значение можно преобразовать в String с помощью cast
select json_object('time', cast(curtime() as string));+------------------------------------------------+
| json_object('time', cast(curtime() as string)) |
+------------------------------------------------+
| {"time":"17:09:42"} |
+------------------------------------------------+ -
Ключи типов, отличных от String, преобразуются в String
SELECT json_object(123, 456);+-----------------------+
| json_object(123, 456) |
+-----------------------+
| {"123":456} |
+-----------------------+ -
NULL нельзя использовать в качестве ключа
select json_object(null, 456);ERROR 1105 (HY000): errCode = 2, detailMessage = json_object key can't be NULL: json_object(NULL, 456)NULL можно использовать в качестве значения
select json_object('key', null);+--------------------------+
| json_object('key', null) |
+--------------------------+
| {"key":null} |
+--------------------------+ -
Строки JSON можно разобрать в объекты JSON с помощью
JSON_PARSEперед передачей вJSON_OBJECTselect json_object(123, json_parse('{"key": "value"}'));+--------------------------------------------------+
| json_object(123, json_parse('{"key": "value"}')) |
+--------------------------------------------------+
| {"123":{"key":"value"}} |
+--------------------------------------------------+В противном случае значение будет обрабатываться как строка
select json_object(123,'{"key": "value"}');+-------------------------------------+
| json_object(123,'{"key": "value"}') |
+-------------------------------------+
| {"123":"{\"key\": \"value\"}"} |
+-------------------------------------+ -
Типы, не поддерживаемые
TO_JSONselect json_object('key', map('abc', 'efg'));ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: to_json(MAP<VARCHAR(3),VARCHAR(3)>)Перед передачей значение можно преобразовать в JSON с помощью CAST:
select json_object('key', cast(map('abc', 'efg') as json));+-----------------------------------------------------+
| json_object('key', cast(map('abc', 'efg') as json)) |
+-----------------------------------------------------+
| {"key":{"abc":"efg"}} |
+-----------------------------------------------------+ -
Пример с повторяющимися ключами
select
json_object('key', 123, 'key', 4556) v1
, jsonb_extract(json_object('key', 123, 'key', 4556), '$.key') v2
, jsonb_extract(json_object('key', 123, 'key', 4556), '$.*') v3;+------------------------+------+------------+
| v1 | v2 | v3 |
+------------------------+------+------------+
| {"key":123,"key":4556} | 123 | [123,4556] |
+------------------------+------+------------+