TO_JSON
デスクリプション
Dorisの内部データタイプをJSONBタイプに変換します。この関数は、互換性のあるDorisデータタイプを精度を失うことなくJSON表現に変換することを可能にします。
Syntax
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
対応するJSONB型を持たないDATETIME、DATE、TIME、IPV4、IPV6型については、STRING型に変換されます。 MAP型については、JSONB Object型に変換されます。JSON標準ではObjectのキーが文字列である必要があるため、Mapのキーは必ずSTRING型でなければなりません。
Return Value
JSONB型の値を返します。
入力valueがSQL NULLの場合、関数はSQL NULLを返します(JSON null値ではありません)。配列や構造体内にNULL値が現れる場合、それらはJSON null値に変換されます。
Examples
Basic scalar values
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" |
+------------+---------------+------------------+
Date型
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を使用する必要があります。 -
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バイトを超えることはできません。