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" |
+-------------------------------------------+
Примечания
-
Некоторые типы не имеют прямого соответствия в JSON (например, DATE). Значения этих типов необходимо сначала преобразовать в STRING, а затем использовать
TO_JSON. -
При преобразовании внутренних типов Doris в JSONB с помощью
TO_JSONточность не теряется, в отличие от преобразования через текстовое представление. -
По умолчанию размер объектов JSONB в Doris ограничен 1,048,576 байтами (1 MB). С помощью параметра конфигурации BE
string_type_length_soft_limit_bytesэто ограничение можно увеличить до 2,147,483,643 байт (приблизительно 2 GB). -
В объектах JSON в Doris длина ключей не может превышать 255 байт.