に最終更新
JSON_OBJECT
説明
指定したキーと値のペアを含む JSON オブジェクトを生成します。キーが NULL の場合、またはパラメータの数が奇数の場合はエラーになります。
構文
JSON_OBJECT (<key>, <value>[, <key>, <value>, ...])
JSON_OBJECT(*)
パラメータ
可変長パラメータ:
-
<key>: 文字列型です。 -
<value>: 複数の型を指定できます。Doris は JSON 型以外のパラメータをTO_JSON関数で自動的に JSON 型に変換します。 -
*: アスタリスク(ワイルドカード)を指定すると、指定したデータの属性名をキー、対応する値を値として JSON オブジェクトを構築します。ワイルドカードを渡すときは、テーブル名またはテーブルのエイリアスで修飾できます。たとえば、mytable というテーブルのすべての列を渡すには、次のように指定します。
(mytable.*)
注意事項
- パラメータの数は偶数である必要があります。0 個も指定でき、その場合は空の JSON オブジェクトを返します。
- 通常、パラメータはキーと値を交互に指定します。
- キーは JSON の定義に従って強制的にテキストに変換されます。
- 渡したキーが NULL の場合は例外エラーになります。
- 値のパラメータは JSON に変換されるため、
TO_JSONがサポートする型である必要があります。 - 渡した値が NULL の場合、返される JSON オブジェクトでは、そのキーと値のペアの値が JSON の null になります。
- その他の型を値として使用する場合は、CAST で JSON 型または String 型に変換できます。
- 現在、Doris は JSON オブジェクト内の重複キーを排除しないため、同じキーを複数回指定できます。ただし、重複キーによって予期しない結果が生じることがあります。
- 他のシステムでは、重複キーに対応する値が削除されたり、エラーが報告されたりする場合があります。
JSON_EXTRACTが返す結果は不確定です。
戻り値
JSON: パラメータのリストから構成される JSON オブジェクトを返します。
例
-
パラメータを指定しない場合
select json_object();+---------------+
| json_object() |
+---------------+
| {} |
+---------------+ -
サポートされない値の型
select json_object('time',curtime());ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: to_json(TIMEV2(0))CAST を使って String 型に変換できます。
select json_object('time', cast(curtime() as string));+------------------------------------------------+
| json_object('time', cast(curtime() as string)) |
+------------------------------------------------+
| {"time":"17:09:42"} |
+------------------------------------------------+ -
文字列型以外のキーは文字列に変換されます
SELECT json_object(123, 456);+-----------------------+
| json_object(123, 456) |
+-----------------------+
| {"123":456} |
+-----------------------+ -
NULL はキーとして使用できません
select json_object(null, 456);ERROR 1105 (HY000): errCode = 2, detailMessage = json_object key can't be NULL: json_object(NULL, 456)NULL は値として使用できます。
select json_object('key', null);+--------------------------+
| json_object('key', null) |
+--------------------------+
| {"key":null} |
+--------------------------+ -
JSON 文字列は
JSON_PARSEで JSON オブジェクトに解析してからJSON_OBJECTに渡せますselect json_object(123, json_parse('{"key": "value"}'));+--------------------------------------------------+
| json_object(123, json_parse('{"key": "value"}')) |
+--------------------------------------------------+
| {"123":{"key":"value"}} |
+--------------------------------------------------+解析しない場合は文字列として扱われます。
select json_object(123,'{"key": "value"}');+-------------------------------------+
| json_object(123,'{"key": "value"}') |
+-------------------------------------+
| {"123":"{\"key\": \"value\"}"} |
+-------------------------------------+ -
TO_JSONがサポートしない型select json_object('key', map('abc', 'efg'));ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: to_json(MAP<VARCHAR(3),VARCHAR(3)>)渡す前に CAST 文で JSON 型に変換できます。
select json_object('key', cast(map('abc', 'efg') as json));+-----------------------------------------------------+
| json_object('key', cast(map('abc', 'efg') as json)) |
+-----------------------------------------------------+
| {"key":{"abc":"efg"}} |
+-----------------------------------------------------+ -
キーが重複する場合
select
json_object('key', 123, 'key', 4556) v1
, jsonb_extract(json_object('key', 123, 'key', 4556), '$.key') v2
, jsonb_extract(json_object('key', 123, 'key', 4556), '$.*') v3;+------------------------+------+------------+
| v1 | v2 | v3 |
+------------------------+------+------------+
| {"key":123,"key":4556} | 123 | [123,4556] |
+------------------------+------+------------+