選択条件への変数の追加 (GETVAR および SETVAR)

内部に条件が含まれる集約ビューを作成したい場合があります。つまり、 WHERE 条件と GROUP BY を使ってビューを作成したい場合です。しかしこれには、 WHERE 条件が静的であるため実行時に変更できないという制約があります。

たとえば、以下の 2 つのビューがあるとします。

  1. name、income、および state というフィールドで構成される基本ビュー CLIENT。

  2. 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 が基本ビューの出力に含まれていない場合、 incomeGROUP BY に追加することはできません。

この問題を避けるため、クエリの定義で関数 GETVAR を使用できます。この関数の構文は次のとおりです。

関数 GETVAR の構文
GETVAR('<name of the variable>', '<type of the variable>', '<default value>')

GETVAR は、クエリの CONTEXT から変数 <name of the variable> の値の取得を試みます。見つからない場合は <default value> を返します。

重要

常に、関数 GETVAR および SETVAR の代わりにビューパラメーターを使用してみてください。これらの関数は、どのソースにもプッシュダウンできないため、このビューへのクエリのパフォーマンスを低下させる可能性があります。一方、パラメーターを使用するよりも、これらの関数を使用した方がはるかに簡単な場合もあります。たとえば、ビューの階層の複数の条件で 1 つの値を使用する場合や、このビューへのクエリのパフォーマンスが問題にならない場合は、これらの関数を使用します。

ビューパラメーターの詳細については、管理ガイドの「 派生ビューのパラメーター 」を参照してください。

たとえば、ビュー WEALTHY_CLIENT_BY_STATE を次のように定義できます。

選択条件 (GETVAR) で変数を使用したビューの定義
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 の構文
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 に入れます。その後、右側のブランチが実行され、 GETVARCONTEXT で変数 _var_wealthy_client_income_limit の値を見つけます。

注釈

結合の「左側」にあるブランチのクエリが複数の行を返す場合、関数 SETVAR は最初の行のフィールド値のみを考慮します。

重要

キャッシュエンジンは関数に対応していません。そのため、キャッシュが有効なビューが含まれるクエリでは関数を使用しないでください。