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, TIMESTAMP_NS, DATE, TIME
- Типы IP: IPV4, IPV6
- Сложные типы: MAP
Значения DATETIME, TIMESTAMP_NS, DATE, TIME, IPV4 и IPV6 преобразуются в строки JSONB, поскольку в JSONB нет соответствующих встроенных типов. Для типа MAP результат преобразования имеет тип JSONB Object. Ключи 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 байт.