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

TO_JSON

Описание​

Преобразует внутренние типы данных Doris в тип JSONB. Эта функция позволяет преобразовывать совместимые типы данных Doris в представление JSON без потери точности.

Синтаксис​

TO_JSON(value)

Параметры​

value - Значение, которое нужно преобразовать в тип JSONB.

Следующие типы напрямую соответствуют типам JSONB и могут быть преобразованы напрямую:

  • Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL
  • Логический тип: BOOLEAN
  • Строковые типы: STRING, VARCHAR, CHAR
  • Сложные типы: ARRAY, STRUCT

Кроме того, функция поддерживает преобразование следующих типов:

  • Типы даты и времени: DATETIME, DATE, TIME
  • Типы IP: IPV4, IPV6
  • Сложные типы: MAP

Значения типов DATETIME, DATE, TIME, IPV4, IPV6, для которых нет соответствующих типов JSONB, преобразуются в тип STRING. Тип MAP преобразуется в тип Object JSONB. Ключи Map должны иметь тип STRING, поскольку стандарт JSON требует, чтобы ключи Object были строками.

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

Возвращает значение типа JSONB.

Если входное значение value равно SQL NULL, функция возвращает SQL NULL (а не значение JSON null). Значения NULL внутри массивов или структур преобразуются в значения JSON null.

Примеры​

Базовые скалярные значения​

SELECT to_json(1), to_json(3.14), to_json("12345");
+------------+---------------+------------------+
| to_json(1) | to_json(3.14) | to_json("12345") |
+------------+---------------+------------------+
| 1 | 3.14 | "12345" |
+------------+---------------+------------------+

Типы даты и времени​

SELECT 
to_json(cast('2020-01-01' as date)) ,
to_json(cast('2020-01-01 12:00:00' as datetime)),
to_json(cast('2020-01-01 12:00:00.123' as datetime(3))),
to_json(cast('2020-01-01 12:00:00.123456' as datetime(6))),
to_json(cast('8:23:45' as time));
+-------------------------------------+--------------------------------------------------+---------------------------------------------------------+------------------------------------------------------------+----------------------------------+
| to_json(cast('2020-01-01' as date)) | to_json(cast('2020-01-01 12:00:00' as datetime)) | to_json(cast('2020-01-01 12:00:00.123' as datetime(3))) | to_json(cast('2020-01-01 12:00:00.123456' as datetime(6))) | to_json(cast('8:23:45' as time)) |
+-------------------------------------+--------------------------------------------------+---------------------------------------------------------+------------------------------------------------------------+----------------------------------+
| "2020-01-01" | "2020-01-01 12:00:00" | "2020-01-01 12:00:00.123" | "2020-01-01 12:00:00.123456" | "08:23:45" |
+-------------------------------------+--------------------------------------------------+---------------------------------------------------------+------------------------------------------------------------+----------------------------------+

Типы IP​

SELECT 
to_json(cast('192.168.0.1' as ipv4)) ,
to_json(cast('2001:0db8:85a3:0000:0000:8a2e:0370:7334' as ipv6));
+--------------------------------------+------------------------------------------------------------------+
| to_json(cast('192.168.0.1' as ipv4)) | to_json(cast('2001:0db8:85a3:0000:0000:8a2e:0370:7334' as ipv6)) |
+--------------------------------------+------------------------------------------------------------------+
| "192.168.0.1" | "2001:db8:85a3::8a2e:370:7334" |
+--------------------------------------+------------------------------------------------------------------+

Преобразование массивов​

SELECT to_json(array(array(1,2,3),array(4,5,6)));
+-------------------------------------------+
| to_json(array(array(1,2,3),array(4,5,6))) |
+-------------------------------------------+
| [[1,2,3],[4,5,6]] |
+-------------------------------------------+
SELECT to_json(array(12,34,null));
+----------------------------+
| to_json(array(12,34,null)) |
+----------------------------+
| [12,34,null] |
+----------------------------+

Доступ к элементам массива в результирующем JSON​

SELECT json_extract(to_json(array(array(1,2,3),array(4,5,6))), '$.[1].[2]');
+----------------------------------------------------------------------+
| json_extract(to_json(array(array(1,2,3),array(4,5,6))), '$.[1].[2]') |
+----------------------------------------------------------------------+
| 6 |
+----------------------------------------------------------------------+

Преобразование структур​

SELECT to_json(struct(123,array(4,5,6),"789"));
+------------------------------------------+
| to_json(struct(123,array(4,5,6),"789")) |
+------------------------------------------+
| {"col1":123,"col2":[4,5,6],"col3":"789"} |
+------------------------------------------+

Доступ к свойствам объекта в результирующем JSON​

SELECT json_extract(to_json(struct(123,array(4,5,6),"789")),"$.col2");
+----------------------------------------------------------------+
| json_extract(to_json(struct(123,array(4,5,6),"789")),"$.col2") |
+----------------------------------------------------------------+
| [4,5,6] |
+----------------------------------------------------------------+

Преобразование MAP​

SELECT to_json(map("1",2,"abc",3));  
+-----------------------------+
| to_json(map("1",2,"abc",3)) |
+-----------------------------+
| {"1":2,"abc":3} |
+-----------------------------+
SELECT to_json(map(1,2));  
to_json only support map with string-like key type

Обработка значений NULL​

-- SQL NULL as input returns SQL NULL
SELECT to_json(null);
+---------------+
| to_json(null) |
+---------------+
| NULL |
+---------------+
-- NULL values within arrays become JSON null values
SELECT to_json(array(12,34,null));
+----------------------------+
| to_json(array(12,34,null)) |
+----------------------------+
| [12,34,null] |
+----------------------------+

Неподдерживаемые типы Doris​

SELECT to_json(makedate(2025,5));
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: to_json(DATE)
-- Convert to string first and then apply to_json
SELECT to_json(cast(makedate(2025,5) as string));
+-------------------------------------------+
| to_json(cast(makedate(2025,5) as string)) |
+-------------------------------------------+
| "2025-01-05" |
+-------------------------------------------+

Примечания​

  1. Некоторые типы не имеют прямого соответствия в JSON (например, DATE). Значения этих типов необходимо сначала преобразовать в STRING, а затем использовать TO_JSON.

  2. При преобразовании внутренних типов Doris в JSONB с помощью TO_JSON точность не теряется, в отличие от преобразования через текстовое представление.

  3. По умолчанию размер объектов JSONB в Doris ограничен 1,048,576 байтами (1 MB). С помощью параметра конфигурации BE string_type_length_soft_limit_bytes это ограничение можно увеличить до 2,147,483,643 байт (приблизительно 2 GB).

  4. В объектах JSON в Doris длина ключей не может превышать 255 байт.