0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Db2でJSONデータを扱う

Last updated at Posted at 2021-11-26

はじめに

Db2では、バージョン11.1.4.4からSQL による JSON データとの対話を向上させる新規の組み込みの JSON SQL 関数一式が提供されています。
それにより、SQL を使用して JSON データを直接保管および検索することができるようになりました。

使用方法を以下に記載します。

なお、環境としては、IBM Cloud上のマネージドのDB2サービスで確認しています。
IBM CloudではLite Planという、クレジットカードの登録なしで、無料で使用できる環境がありますので、お気軽にお試しください。

参考資料:IBM Db2 マニュアル
JSON ドキュメントへの SQL アクセス

1. テーブル定義

ここでは以下のような社員情報を格納することを想定します。
EMPOLYEEIDとNAMEは通常のデータで、PROFILE欄にJSONデータを格納します。

EMPLOYEEID NAME PROFILE
100 Tom {hobby: "baseball", license: "driver"}
101 Ken {hobby: "football"}
101 Jhon {license: "CPA"}

JSONデータを格納する列PROFILEはBlob型で定義します。

CERATE TABLE EMPLOYEES (
	EMPLOYEEID integer primary key not null,
	NAME varchar(10) not null,
	PROFILE Blob(1000)
);

2. レコード登録

JSONデータを格納する際は、SYSTOOLSスキーマのJSON2BSON関数をつかって格納します。

INSERT INTO TESTJSON VALUES (100, "Tom", SYSTOOLS.JSON2BSON('{hobby: "baseball", license: "driver"}'));

3. レコード検索

取り出すときは、SYSTOOLSスキーマのBSON2JSON関数をつかって取り出します。

SELECT EMPLOYEEID, NAME, SYSTOOLS.BSON2JSON(PROFILE) as PROFILE FROM EMPLOYEES;

JSONの中身を条件に抽出したい場合は、JSON_VAL関数を使用します。

(例)JSONのhobbyキーにbaseballが入っている人を抽出
SELECT EMPLOYEEID, NAME, SYSTOOLS.BSON2JSON(PROFILE) as PROFILE FROM EMPLOYEES WHERE SYSTOOLS.JSON_VAL(PROFILE, 'hobby','s:20') = 'baseball';

※JSON_VALの引数には、JSONが入っている列名、検索するJSONのキー、戻り値の型(例の's:20'は最大20文字の文字列として返すという意味です。)を指定します。

4. レコード更新

JSONの中身を更新した場合はUPDATE分で、JSONの値を変更しないキーも含めて、すべての情報のJSONデータで上書きします。

(例) Tomのホビーを、tennisに書き換える
UPDATE EMPLOYEES SET PROFILE = SYSTOOLS.JSON2BSON('{hobby: "tennis", license: "driver"}') WHERE NAME = 'Tom';
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?