Перейти к содержимому
Последнее обновление

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, поэтому повторяющиеся ключи допускаются. Однако повторяющиеся ключи могут приводить к неожиданным результатам:
    1. Другие системы могут отбрасывать значения, соответствующие повторяющимся ключам, или сообщать об ошибках.
    2. Результат, возвращаемый JSON_EXTRACT, не определён.

Возвращаемое значение​

JSON: возвращает объект JSON, сформированный из списка параметров.

Примеры​

  1. Пример без параметров

    select json_object();
    +---------------+
    | json_object() |
    +---------------+
    | {} |
    +---------------+
  2. Неподдерживаемые типы значений

    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"} |
    +------------------------------------------------+
  3. Ключи типов, отличных от String, преобразуются в String

    SELECT json_object(123, 456);
    +-----------------------+
    | json_object(123, 456) |
    +-----------------------+
    | {"123":456} |
    +-----------------------+
  4. 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} |
    +--------------------------+
  5. Строки JSON можно разобрать в объекты JSON с помощью JSON_PARSE перед передачей в JSON_OBJECT

    select 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\"}"} |
    +-------------------------------------+
  6. Типы, не поддерживаемые TO_JSON

    select 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"}} |
    +-----------------------------------------------------+
  7. Пример с повторяющимися ключами

    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] |
    +------------------------+------+------------+