に最終更新
JSON_OBJECT
説明
指定したキーと値の組から JSON オブジェクトを生成します。キーが NULL の場合、または引数の数が奇数の場合はエラーになります。
構文
JSON_OBJECT (<key>, <value>[, <key>, <value>, ...])
JSON_OBJECT(*)
パラメータ
可変長パラメータ:
| パラメータ | 説明 |
|---|---|
<key> | 文字列型のキー。NULL は指定できません。 |
<value> | 値。複数の型を指定でき、JSON 型以外は TO_JSON で自動変換されます。 |
* | ワイルドカード。指定したデータの属性名をキー、対応する値を値としてオブジェクトを作ります。 |
ワイルドカードにはテーブル名または別名を付けられます。例えば mytable のすべての列を渡すには、次のように指定します。
(mytable.*)
注意事項
- 引数の数は偶数である必要があります。0 個も指定でき、その場合は空の JSON オブジェクトを返します。
- 引数にはキーと値を交互に指定します。
- JSON の定義に従い、キーは文字列に変換されます。
- キーが NULL の場合はエラーになります。
- 値には
TO_JSONがサポートする型を指定し、JSON に変換します。 - 値が NULL の場合、返される JSON オブジェクト内では JSON の null 値になります。
- ほかの型を値として使うには、CAST で JSON または String に変換できます。
- Doris は現在、JSON オブジェクトのキーを重複排除しません。重複キーは指定できますが、予期しない結果になる場合があります。
- 他のシステムは重複キーの値を破棄したり、エラーを返したりする場合があります。
JSON_EXTRACTの結果は一定しません。
戻り値
JSON 型で、引数から構成した JSON オブジェクトを返します。キーが NULL、または引数の数が奇数の場合はエラーになります。
例
-
引数なしの場合
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"} |
+------------------------------------------------+ -
String 型以外のキーは String に変換されます
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] |
+------------------------+------+------------+