
こんにちは。CData Software Japan の色川です。
CData Software がお届けするCData Drivers は、kintone、Salesforce、SharePoint など、あらゆるデータに標準SQL での接続を可能にする高機能・高品質なデータコネクタです。CData Drivers を使えば、お気に入りのBI・ETL ツール、開発言語から、275 種類以上のデータソースへ「確固とした標準を持つSQL」を利用して自在にデータを活用することができます。
CData Drivers が準拠するSQL-92(SQL2)標準は、各社のデータベースでも広く実装されており、習熟も活用も広く浸透しています。CData Drivers では、SaaS などのサーバーサイドでサポートされないクエリ構文でも、クライアントサイドであるDrivers のSQL 実行エンジンによりSQL-92 に準拠したオペレーションを実現しています。
CData Drivers ではSQL-92(SQL2)標準に準拠していますが、SQL-92(SQL2)標準のスコープを超えた一部の機能も実験的に提供しています。
この記事では、そのような実験的に提供されている機能の1つである「テーブル値関数(Table-Valued Functions)」について利用例とともにご紹介します。

テーブル値関数(Table-Valued Functions)
テーブル値関数は、その名前のとおり「テーブル(行セット)を返す関数」です。単一の値(数値や文字列など)を返す通常の関数とは異なり、テーブル値関数(Table-Valued Functions)は行と列からなるデータのかたまり(行セット)を返すことができます。
SaaS やWeb API に限らず、実際の業務でデータを扱う場面では、JSON 形式(JSON 配列)で保存されているカラムや、複数の値が値の区切り文字を含む単一文字列として保存されているカラムなど、テーブル形式で扱うには加工や整形が必要なデータ構造に遭遇する機会もあるかと思います。
CData Drivers のテーブル値関数では、JSON 配列をテーブル値として取得するJSONTABLE() や、区切り文字を含むカラムをテーブル値として取得するSTRING_SPLIT() など、そのような場面で利便性高く使える複数のテーブル値関数を提供しています。テーブル値関数を扱うクエリ構文では、CROSS APPLY 演算子とWITH 句を使用します。

なお、テーブル値関数はCData Drivers において実験的に提供されている機能です。そのため、これらの関数のパフォーマンスは最適ではない場合がありますので、その点についてはあらかじめご留意ください。パフォーマンスなどには留意いただきつつ、場面によっては大きな利便を得られる機能ですので、ぜひ上手く活用してください。
テーブル値関数の利用例(kintone のファイルフィールド)
この記事では、テーブル値関数の利用例として、kintone の添付ファイル(FILE)フィールドに対して、JSONTABLE() テーブル値関数を利用してみます。
CData のkintone driver では、kintone のユーザー選択(USER_SELECT)や組織選択(ORGANIZATION_SELECT)のように「value がオブジェクトを要素に持つ配列」として返されるカスタムフィールドについては、Aggregate カラムとして、そのvalue であるJSON 文字列を列値としてそのまま取得(出力)します。添付ファイル(FILE)フィールドもその1つです。

この記事では、kintone サンプルアプリの「ファイル管理」を利用して試してみました。「ファイル管理」アプリには「ファイル」フィールドに複数の添付ファイルを含むレコードも登録しています。

この記事ではDbVisualizer からCData kintone driver を利用してkintone の「ファイル管理」アプリのデータへアクセスしていきます。CData kintone driver ではアプリはテーブルとして扱われます。「ファイル管理」テーブルをそのままクエリすると「ファイル」フィールドは、JSON 文字列(添付ファイル単位のオブジェクトを要素に持つ配列)として取得されます。
SELECT `RecordId`, `ファイル Aggregate` FROM ファイル管理

このような場面において、添付ファイル単位にテーブル形式で扱うことができるのが、JSONTABLE() テーブル値関数です。時に、こういうクエリでレコード単位で取得することができます。
SELECT A.RecordId AS RecordId, X.fileKey AS fileKey, X.name AS name, X.contentType AS contentType, X.size AS size FROM `ファイル管理` A CROSS APPLY JSONTABLE(A.`ファイル Aggregate`) WITH (fileKey VARCHAR(255), name VARCHAR(255), contentType VARCHAR(255), size Integer) AS X

もし、レコードに含まれる添付ファイルごとに識別のための番号を振りたければ、テーブル値関数と同じように、実験的に提供されている「Window 関数(Window Functions)」に含まれるRANK() などを活用しても便利そうです。
SELECT A.RecordId AS RecordId, RANK() OVER (PARTITION BY A.`RecordId` ORDER BY X.fileKey) AS Rank, X.fileKey AS fileKey, X.name AS name, X.contentType AS contentType, X.size AS size FROM `ファイル管理` A CROSS APPLY JSONTABLE(A.`ファイル Aggregate`) WITH (fileKey VARCHAR(255), name VARCHAR(255), contentType VARCHAR(255), size Integer) AS X

CData Drivers には文字列関数として、JSON ドキュメントから指定したJSONPath の値を抽出できるJSON_EXTRACT 関数なども備えていますが、添付ファイル(FILE)フィールドに含まれる添付ファイルの単位で行セットとして扱いたいような場面では、JSONTABLE() テーブル値関数も利便性の高い選択肢として活用いただけると思います。
CData アプリケーションからのテーブル値関数の利用例(CData Arc)
CData Drivers が提供するテーブル値関数は、CData が提供するアプリケーションでも利用することができます。例えば、CData 製品の中でデータ連携の自動化(Automation)を担うCData Arc の場合、データを抽出するSelect アクションや、データを検索・追加するLookup アクションの中でカスタムクエリとして構成することで利用することができます。


この記事で紹介したテーブル値関数を含め、CData Drivers が提供する豊富な機能を上手く活用いただくことで、CData Arc でのデータ連携の自動化も、より幅広い選択肢から & よりフィットするアプローチで実現を検討いただけるようになると思います。ぜひご活用ください。
まとめ
この記事では、CData Drivers で実験的に提供されている機能の1つである「テーブル値関数(Table-Valued Functions)」についてご紹介しました。
テーブル値関数はCData Drivers において実験的に提供されている機能のため、これらの関数のパフォーマンスは最適ではない場合があります。その点についてはあらかじめご留意ください。パフォーマンスなどには留意いただきつつ、この記事で紹介したように場面によっては大きな利便を得られる機能ですので、ぜひ上手く活用してください。テーブル値関数はCData kintone driver に限らず、全てのCData Drivers で利用することができます。
今回ご紹介したCData kintone Driver を含め、CData Drivers では30日間、全機能を評価いただけるトライアルライセンスを利用いただけます。もちろん、Arc やSync などのアプリケーションでも機能評価のためのトライアルライセンスを利用いただけます。
ご関心のある方は、ぜひトライアルしてみてください。
製品を試していただく中で何かご不明な点があれば、テクニカルサポートへお気軽にお問い合わせください。
CData Software Japan - Support Form
この記事では以下の製品を利用しています。
- CData JDBC Driver for Kintone 24.0.9175
- CData Arc™ 2025 - 25.1.9236.0
関連コンテンツ