コンテンツにスキップ

JSON関数とJSONドット表記

Machbaseは、JSON型の列に保存されたデータを操作・参照する関数とJSONドット表記を提供します。

クイックリファレンス

関数/表記構文説明
JSONドット表記col.keyJSONオブジェクトからキーの値を抽出
JSON_EXTRACTJSON_EXTRACT(doc, path)JSONパスの値をJSON文字列として抽出
JSON_EXTRACT_STRINGJSON_EXTRACT_STRING(doc, path)JSONパスの値を文字列として抽出
JSON_EXTRACT_INTEGERJSON_EXTRACT_INTEGER(doc, path)JSONパスの値を整数として抽出
JSON_EXTRACT_DOUBLEJSON_EXTRACT_DOUBLE(doc, path)JSONパスの値を実数として抽出
JSON_TYPEOFJSON_TYPEOF(doc, path)指定したJSONパスの値の型を確認
JSON_IS_VALIDJSON_IS_VALID(json_text)JSON文字列の妥当性を確認
JSON_SETJSON_SET(doc, path, scalar)JSONパスにスカラー値を設定
JSON_SET_JSONJSON_SET_JSON(doc, path, json_text)JSONパスにJSONサブツリーを設定
JSON_REMOVEJSON_REMOVE(doc, path)JSONパスのメンバーを削除

JSON_TYPEOFpathは必須引数です。JSONドキュメント全体の型はJSON_TYPEOF(doc, '$')で確認します。


JSONドット表記

JSON列の後にドット(.)とキー名を付けて、そのキーの値を参照します。 JSONPath文字列を書かずにJSON列のメンバーへアクセスする場合に使用します。

json_column.key
-- JSON列から特定キーの値を抽出
SELECT data.temperature AS temp FROM sensor_log;

-- WHERE句で使用
SELECT * FROM sensor_log
 WHERE data.status = 'active';

JSONPath文字列を直接指定する場合は、data -> '$.temperature'のように->演算子を使用します。 上記のJSONドット表記とは区別して記述してください。


JSON_SET

JSONドキュメントの指定パスにSQLスカラー値をJSONスカラーとして保存します。

JSON_SET(json_doc, path, scalar)
  • pathには完全なJSONPath($.key.subkey形式)を使用してください。
  • JSON_SET(..., path, NULL)はJSONのnullを保存します。
  • JSONドキュメント引数がSQL NULLなら、結果はSQL NULLです。
  • 配列要素の更新($.items[0])はサポートしません。
Mach> SELECT JSON_SET('{"ship":{"status":"READY"}}', '$.ship.status', 'DONE') FROM dual;
{"ship":{"status":"DONE"}}

Mach> SELECT JSON_SET('{"count":0}', '$.count', 42) FROM dual;
{"count":42}

JSON_SET_JSON

第3引数をJSON文字列として解析し、オブジェクトまたは配列のサブツリーを保存します。

JSON_SET_JSON(json_doc, path, json_text)
  • 第3引数がSQL NULLなら、結果はSQL NULLです。
  • 無効なJSON文字列はエラーになります。
  • 配列要素の更新はサポートしません。
Mach> SELECT JSON_SET_JSON('{"ship":{}}', '$.ship.owner', '{"name":"machbase"}') FROM dual;
{"ship":{"owner":{"name":"machbase"}}}

Mach> SELECT JSON_SET_JSON('{"tags":{}}', '$.tags.sensors', '[1,2,3]') FROM dual;
{"tags":{"sensors":[1,2,3]}}

JSON_REMOVE

JSONドキュメントから特定のメンバーまたは下位パスを削除します。

JSON_REMOVE(json_doc, path)
  • pathには完全なJSONPathを使用してください。
  • 存在しないパスは何も変更しません。
  • JSON_REMOVE(..., '$')は許可しません。
  • JSONドキュメント引数がSQL NULLなら、結果はSQL NULLです。
Mach> SELECT JSON_REMOVE('{"owner":{"name":"machbase","team":"db"}}', '$.owner.team') FROM dual;
{"owner":{"name":"machbase"}}

Mach> SELECT JSON_REMOVE('{"a":1,"b":2}', '$.a') FROM dual;
{"b":2}

JSONデータの挿入例

-- JSON型の列を含むLOGテーブル
CREATE LOG TABLE device_log (
    ts    DATETIME,
    data  JSON
);

-- JSONデータの挿入
INSERT INTO device_log VALUES (NOW, '{"temperature":23.5,"humidity":60,"status":"active"}');

-- JSONドット表記で値を抽出
SELECT ts, data.temperature AS temp
  FROM device_log
 WHERE data.status = 'active';

テーブルタイプ別のJSONサポート状況

テーブルタイプJSON列JSON path query備考
TAGOOJSON列とJSON関数をサポート。JSON PKは非対応
LOGOO完全にサポート
LOOKUPOO通常の列としてサポート。JSONパスインデックスは非対応
VOLATILEXXJSON列の作成不可
TRANSACTIONOO完全にサポート

詳細はJSON型のテーブルタイプ別サポート範囲を参照してください。

最終更新日