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
JSONB에는 해당하는 네이티브 타입이 없으므로 DATETIME, TIMESTAMP_NS, DATE, TIME, IPV4, IPV6 값은 JSONB 문자열로 변환됩니다. MAP 타입은 JSONB Object 타입으로 변환됩니다. JSON 표준에서는 Object 키가 문자열이어야 하므로 Map 키는 STRING 타입이어야 합니다.
반환값
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" |
+-------------------------------------------+
참고 사항
-
일부 타입(예: DATE)은 JSON에 직접 매핑되지 않습니다. 이러한 타입은 먼저 STRING으로 변환한 다음
TO_JSON을 사용해야 합니다. -
TO_JSON을 사용하여 Doris 내부 타입을 JSONB로 변환하면 텍스트 표현을 거쳐 변환할 때와 달리 정밀도 손실이 발생하지 않습니다. -
Doris의 JSONB 객체는 기본적으로 크기가 1,048,576바이트(1 MB)로 제한되며, BE 설정
string_type_length_soft_limit_bytes를 통해 최대 2,147,483,643바이트(약 2 GB)까지 조정할 수 있습니다. -
Doris JSON 객체의 키 길이는 255바이트를 초과할 수 없습니다.