選択条件への変数の追加 (GETVAR および SETVAR)¶
内部に条件が含まれる集約ビューを作成したい場合があります。つまり、 WHERE
条件と GROUP BY
を使ってビューを作成したい場合です。しかしこれには、 WHERE
条件が静的であるため実行時に変更できないという制約があります。
たとえば、以下の 2 つのビューがあるとします。
name、income、および state というフィールドで構成される基本ビュー CLIENT。
WEALTHY_CLIENT_BY_STATE
ビュー。次のように定義されています。CREATE VIEW WEALTHY_CLIENT_BY_STATE AS SELECT state, COUNT(*) FROM client WHERE income > 1000000 GROUP BY state
2 番目のビューには制限があります。つまり、顧客を裕福とみなす所得制限値が静的になっています。したがって、ビューを作成する前にこの制限のことを知っている必要があります。実行時にこの制限を変更する場合、 WHERE
条件を削除して income
フィールドを GROUP BY
フィールドに追加する方法があります。しかしこれでは income
フィールドでグループ化することになり、目的の処理とは違ってしまいます。また、 income
が基本ビューの出力に含まれていない場合、 income
を GROUP BY
に追加することはできません。
この問題を避けるため、クエリの定義で関数 GETVAR
を使用できます。この関数の構文は次のとおりです。
GETVAR('<name of the variable:literal>', '<type of the variable:literal>', '<default value:literal>')
GETVAR
は、クエリのコンテキストから変数 <name of the variable>
の値の取得を試みます。見つからない場合は <default value>
を返します。
重要
常に、関数 GETVAR
および SETVAR
の代わりにビューパラメータを使用してみてください。これらの関数は、どのソースにもプッシュダウンできないため、このビューへのクエリのパフォーマンスを低下させる可能性があります。一方、パラメータを使用するよりも、これらの関数を使用した方がはるかに簡単な場合もあります。たとえば、ビューの階層の複数の条件で 1 つの値を使用する場合や、このビューへのクエリのパフォーマンスが問題にならない場合は、これらの関数を使用します。
ビューパラメータの詳細については、管理ガイドの「 派生ビューのパラメータ 」を参照してください。
たとえば、ビュー WEALTHY_CLIENT_BY_STATE
を次のように定義できます。
CREATE VIEW WEALTHY_CLIENT_BY_STATE AS
SELECT state, COUNT(*)
FROM client
WHERE income >= GETVAR('_var_wealthy_client_income_limit', 'int',
1000000)
GROUP BY state
この変更により、所得の制限が静的ではなくなり、実行時にこの値を定義して、ビューに対してクエリを実行できます。
SELECT * FROM WEALTHY_CLIENT_BY_STATE
CONTEXT ('VAR _var_wealthy_client_income_limit' = '250000')
変数の値をクエリの CONTEXT
に入れなかった場合、選択条件で使用される値は、関数 GETVAR
の <default value>
、つまり 1000000
となります。
もう 1 つのオプションは、実行時に別のビューから変数の値を取得し、関数 SETVAR
を使用してこの値を CONTEXT
に入れる方法です。この関数の構文は次のとおりです。
SETVAR('<name of the variable>', '<value of the variable')
たとえば、変数 _var_wealthy_client_income_limit
に使用したい値を含む 1 行を返す DF 基本ビュー INCOME_LIMIT
があるとします。
SELECT WEALTHY_CLIENT_BY_STATE.*
FROM
(SELECT SETVAR('_var_wealthy_client_income_limit', limit)
FROM INCOME_LIMIT WHERE type = 'wealthy')
NESTED ORDERED JOIN
WEALTHY_CLIENT_BY_STATE;
2 つのビューの間で NESTED JOIN
を実行します。このタイプの結合では左側のブランチが最初に実行されるからです。つまり、サーバーは最初にビュー INCOME_LIMIT
に対してクエリを実行し、関数 SETVAR
が変数の値を CONTEXT
に入れます。その後、右側のブランチが実行され、 GETVAR
が CONTEXT
で変数 _var_wealthy_client_income_limit
の値を見つけます。
注釈
結合の「左側」にあるブランチのクエリが複数の行を返す場合、関数 SETVAR
は最初の行のフィールド値のみを考慮します。
重要
キャッシュエンジンは関数に対応していません。そのため、キャッシュが有効なビューが含まれるクエリでは関数を使用しないでください。