注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
SQL クエリ変数は、モジュール内のオブジェクトセットやほかの変数に対して SQL クエリを実行することで値が計算される Workshop 変数です。変数エディターで単一の Ontology SQL SELECT 文を記述し、オブジェクトセット変数とインターフェースセット変数をテーブルとして、ほかの変数をパラメーターとしてバインドします。Workshop は、入力が変わるたびにクエリを実行して変数の値を求めます。

SQL クエリ変数は、SQL では自然に記述できるものの、ほかの方法では表現しにくい計算に最適です。たとえば、RANK()、ROW_NUMBER()、LAG()、LEAD() などのウィンドウ関数を使うと、関数を記述してデプロイすることなく、オントロジーデータに対して直接、順位、累計、前期比を計算できます。また、複数のオブジェクトセットを結合し、カスタムウィジェット用に構造体の配列を返すなど、複雑なオントロジークエリを単一のリクエストにまとめる場合にも効果的です。
SQL クエリ変数と、変数の値を計算するほかの方法を比較して検討します。
SELECT 文では実現できない機能が必要な場合に使用します。SQLクエリ定義タイプは、次の変数タイプで利用可能です。
| 変数タイプ | 変数が想定するクエリ結果 |
|---|---|
| 文字列、数値、ブール値、日付、タイムスタンプ | 正確に1行1列。 |
| 文字列、数値、ブール値、日付、またはタイムスタンプ配列 | 正確に1列で、10,000行未満。 |
| 構造体 | 正確に1行。各列が構造体フィールドになります。 |
| 構造体配列 | 10,000行未満。各行が1個の構造体になります。 |
現在、オブジェクトセット変数、Geopoint 変数、Geoshape 変数は SQL クエリを元にすることができません。
オブジェクトセット変数は、クエリでテーブルとして利用可能になります。テーブルの下でテーブルを追加を選択し、オブジェクトセット変数を選んでエイリアスを指定します。クエリ内では、@alias 構文でテーブルを参照します。
Copied!1SELECT COUNT(*) FROM @orders;
エイリアスは英字またはアンダースコアで始め、英数字またはアンダースコアのみを含める必要があります。テーブルの列は @alias.column_name で修飾します。date という名前の列はバッククォートでエスケープする必要があります。
Copied!1SELECT AVG(@orders.total) FROM @orders WHERE @orders.`date` >= '2026-01-01';
バインドされた各テーブルには、列を1つ以上選択する必要があります。テーブルバインディングの下にある列検索を使用して、クエリが参照するプロパティを追加します。列が定義されていないテーブルバインディングは、エラー Table binding '@alias' does not have any columns defined で失敗します。
オブジェクトセット変数とインターフェースセット変数の両方をテーブルとしてバインドできます。インターフェースセット変数の場合、クエリで利用可能な列はインターフェースのプロパティです。そのため、単一のクエリで、そのインターフェースを実装するすべてのオブジェクトタイプを対象にできます。
複数のテーブルをバインドして、クエリ内で結合できます。結合は主キーと外部キーの関係に基づく必要があり、一方のテーブルの外部キープロパティを、もう一方のテーブルの主キーと一致させます。
Copied!1 2 3SELECT COUNT(*) FROM @orders INNER JOIN @customers ON @orders.customerId = @customers.id;
ON 句で使用するすべての列は、SELECT リストの列と同様に、そのテーブルバインディングで選択された列に含まれている必要があります。
多対多の関係は、主キーと外部キーの直接的な関係ではなく結合テーブルを介して解決されるため、まだサポートされていません。
ほかの変数を、パラメーターとしてクエリにバインドできます。パラメーターの下でパラメーターを追加を選択し、変数を選んでエイリアスを指定します。同じ @alias 構文でパラメーターを参照します。実行時に変数の現在の値が代入され、バインドされたパラメーターが変わるたびにクエリが再計算されます。
Copied!1SELECT COUNT(*) FROM @orders WHERE @orders.region = @selectedRegion;
クエリエディターでは、バインドされたテーブル、列、パラメーターを自動補完できます。保存して実行を選択するか、Cmd + Enter(macOS)または Ctrl + Enter(Windows)のキーボードショートカットを使用して、クエリを実行し、変数の値を更新します。クエリでは Ontology SQL 方言を使用します。サポートされる構文と関数については、SQL 方言リファレンスを参照してください。
エディターの下にあるクエリプレビューパネルを展開すると、クエリが実際に返す行と列を確認できます。プレビューは最大50行を読み込み、生の SQL 結果を表示するため、変数自体では拒否されるクエリをまだ調整している段階でも役立ちます。
変数タイプによって、Workshop がクエリ結果を読み取る方法が決まります。どの場合でも、行の順序はクエリが返す順序です。順序が重要な場合は ORDER BY を使用します。
スカラー変数には、結果がちょうど1行1列である必要があります。複数の行または列を返すクエリは、最初の値だけを暗黙に読み取るのではなく、失敗します。
配列変数には、結果がちょうど1列である必要があります。すべての行が配列に追加されます。セル自体が配列フィールドの場合は、そのすべての要素が追加され、順序を保持した単一の配列にフラット化されます。
Copied!1 2 3 4 5-- 1個の配列セル: ['a', 'b', 'c'] に解決されます SELECT array('a', 'b', 'c') AS value; -- 行ごとに1個のスカラー値:返されたすべての名前を含む1個の配列に解決されます SELECT name FROM @employees ORDER BY name;
次の動作にも留意してください。
LIMIT を追加するよう求められます。
構造体変数では、フィールドは変数の設定で宣言するのではなく、クエリ結果から導出されます。動作は次の3つのルールで定義されます。
変数タイプによって外側の形式が決まり、クエリによってフィールドが決まります。
| 変数タイプ | クエリ結果 | 変数の値 |
|---|---|---|
| 構造体 | 1行 | 1個の構造体 |
| 構造体 | 2行以上 | エラー |
| 構造体 | 行なし | 変数は未設定 |
| 構造体配列 | 10,000行未満 | 行ごとに1個の構造体 |
| 構造体配列 | 行なし | 空の配列 |
実行に成功するたびにフィールドが再導出され、追加、削除、名前の変更、データ型の変更が変数に適用されます。ウィジェットがバインドされているフィールドを新しいクエリが返さなくなると、そのバインディングは機能しなくなります。構造体クエリが選択する列を変更した後は、ウィジェットの設定を確認してください。
NULL を返す列からは、そのフィールドに値がない構造体が生成されます。フィールド自体は変数に引き続き存在します。
各フィールドはちょうど1列から生成される必要があるため、SELECT リストにはいくつかの要件があります。
SELECT COUNT(*) AS order_count。AS を使用してそれぞれにエイリアスを指定します。@alias.column.* を使用してフィールドごとに1列に展開します。ARRAY<STRING> の列からは、文字列のリストを保持するフィールドが生成されます。構造体の配列はフィールドとして利用できません。次の例は、name 列と、city フィールドを含む addr 構造体列を持つ、バインドされたテーブル @t に対して、これらのルールを示しています。
Copied!1 2 3 4 5SELECT name FROM @t; -- 構造体: {'name': 'Ada'} SELECT @t.addr.* FROM @t; -- 構造体: {'city': 'Springfield'}; これには列参照 @t が必要です。 SELECT @t.addr FROM @t; -- エラー:代わりに構造体の列を展開します SELECT name, name FROM @t; -- エラー:列名が重複しています SELECT COUNT(*) FROM @t; -- エラー:列にエイリアスを付けます
オブジェクトタイプにすでに構造体プロパティがある場合、そのフィールドを1つずつ手動で列挙する必要はありません。プロパティの末尾に .* を追加すると、フィールドごとに1列に展開され、それらが構造体変数のフィールドになります。
Copied!1 2SELECT @t.structField.* FROM @t;
street、city、postalCode のフィールドを持つ構造体プロパティからは、同じ3個のフィールドを持つ構造体変数が生成されます。構造体列自体をフィールドにすることはできないため、.* なしでプロパティを選択すると失敗します。展開したプロパティをほかの列と組み合わせるには、両方を選択します。SELECT @t.name, @t.addressStruct.* FROM @t。展開されたフィールド名がほかの列名と重複しないことを確認してください。
値が構造体である変数では、クエリとそこから導出されるフィールドが一緒に保存されます。保存して実行では、まずクエリが実行され、クエリが成功し、その列を構造体の生成元として使用できる場合にのみ、クエリと導出されたフィールドが保存されます。クエリの実行に失敗した場合、または構造体の生成元として使用できない列が返された場合は、何も保存されません。ドラフトはエディターに残り、以前に保存されたクエリとフィールドが引き続き有効になります。失敗は、クエリプレビューの上部と、エディター内のインラインエラーの両方で報告されます。
保存されたフィールドは、実行時に変数が解決される際にも検証されます。そのため、公開済みアプリケーションの元データが変更された場合、異なる形式の値に解決されるのではなく、影響を受ける列名を示すエラーが報告されます。
手動でクエリを記述する代わりに、自然言語の説明からクエリを生成できます。計算したい値を説明するプロンプトを入力すると、AIP が設定済みのテーブル、パラメーター、変数の出力タイプを使用して SQL クエリを生成します。AIP はオントロジー SQL の方言と定義済みのエイリアスに制約されるため、生成されるクエリでは、その変数で利用可能なテーブル、列、パラメーターのみが参照されます。生成されたクエリはエディターに入力され、自動的に実行されます。結果を確認し、必要に応じてクエリを編集します。
ウィンドウ関数は、SQL クエリ変数を使用する一般的な理由の1つです。次のクエリは、@employees オブジェクトセットと @department パラメーターをバインドし、選択した部門で最も収入が高い従業員の名前を返します。
Copied!1 2 3 4 5 6 7 8SELECT name FROM ( SELECT name AS name, RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM @employees WHERE department = @department ) WHERE salary_rank = 1;
構造体変数には、1回のクエリで計算された関連する複数の値を格納でき、ウィジェットはそれらにフィールドごとにバインドできます。次のクエリは、選択した部門の概要をまとめた単一の構造体を返します。
Copied!1 2 3 4 5SELECT COUNT(*) AS headcount, AVG(salary) AS average_salary, MAX(salary) AS top_salary FROM @employees WHERE department = @department;
同じ変数の変数タイプを構造体配列に設定すると、行ごとに1個の構造体が返されます。これは、ループレイアウトで順位付きリストを表示するのに役立ちます。
Copied!1 2 3 4 5 6SELECT name, salary FROM @employees WHERE department = @department ORDER BY salary DESC LIMIT 10;