入力に複合値を使用したリクエスト¶
Denodo Web サービスには、複合フィールドによる条件を追加する方法が 2 つあります。
以下に示すような VQL の通常の構文を使用します。
SELECT ...
FROM V
WHERE input_array_field = { ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL
, NULL, NULL, NULL, NULL ) }
以下に示す URL では、この構文を使用して、配列フィールド
input_array_field
による条件を指定しています。
http://acme:9090/denodo-restfulws/.../views/V?input_array_field={ ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) }
値
{ ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) }
はレジスターの配列です。ROW(...)
を囲む中括弧は、この値が配列であることを示します。中括弧がない場合はレジスターです。この構文については、『VQL ガイド』の「 複合値の管理 」を参照してください。
複合値で条件を表すもう 1 つの構文では JSON ドキュメントを使用します。以下のようなビューがあるとします。
CREATE OR REPLACE VIEW v1 AS
SELECT 94301 AS zipcode,
'ULT' AS ref
UNION
SELECT 94303 AS zipcode,
'JPZ' AS parcelle;
CREATE OR REPLACE VIEW view_with_an_array AS
SELECT nest(zipcode, ref) AS location
FROM v1;
次のクエリには、このビューが返す配列に一致する条件があります。
SELECT *
FROM view_with_an_array
WHERE location = { ROW (94301, 'ULT'), ROW (94303, 'JPZ') };
REST Web サービスで同じフィルタを作成するには、以下の値を指定してパラメータ $filter を追加します。
location = '[{"zipcode":94301, "ref": "ULT"}, {"zipcode":94303, "ref": "JPZ"}]'.
このパラメータを追加すると、URL は以下のようになります。
http://acme:9090/denodo-restfulws/admin/views/view_with_an_array?$filter=location='[{"zipcode":94301, "ref": "ULT"}, {"zipcode":94303, "ref": "JPZ"}]'
重要
見やすさを考慮して、上記の URL はエスケープしていません。実際には、HTTP クライアントはすべてのパラメータの値をエスケープする必要があります。URL を正しくエンコードすることが重要で、これは以前の URL をエンコードしたものです。
http://acme:9090/denodo-restfulws/admin/views/view_with_an_array?$filter=location%20%3D%20%27%5B%7B%22zipcode%22%3A94301%2C%20%22ref%22%3A%20%22ULT%22%7D%2C%20%7B%22zipcode%22%3A94303%2C%20%22ref%22%3A%20%22JPZ%22%7D%5D%27
JSON 構文の制限
JSON ドキュメントは、フィールドの値としてではなく、
$filter
パラメータで指定する必要があります。つまり、?field_name='<json document>'
は機能しません。JSON ドキュメントは必ず一重引用符で囲み、JSON ドキュメント内部で使用している一重引用符はエスケープします。一重引用符をエスケープするには、その直前に一重引用符を 1 つ付加します。