%FILTER 節 (MDX)
構文および詳細
select_statement %FILTER set_expression
以下は、この指定の説明です。
-
select_statement は、SELECT を使用する文です。
-
set_expression は、メンバまたはタプルのセットを返す式です。
set_expression の代わりに、メジャー検索式を使用できます。この場合の %FILTER の動作については、例を参照してください。
InterSystems MDX では、必要に応じてタイプが自動的に変換されるため、セット式の代わりに、単一のメンバ式またはタプル式を使用することもできます。
%FILTER 節は、必要な数だけ含めることができます。この節は、SELECT 文に付加するだけで、結果をさらにフィルタ処理できるため、プログラムでクエリを実行する場合に特に便利です (これに対して、WHERE 節を使用して別のフィルタ項目を追加する必要がある場合、許可される WHERE 節が 1 つのみであるため、WHERE 節を書き換える必要があります)。
各セット要素は別のスライサ軸として使用され、(すべての %FILTER 節の) すべてのスライサ軸の結果がいっしょに集約されます。これは軸のたたみ込みのプロセスです (フィルタはクエリ軸と見なされます)。軸のたたみ込みを実行すると、どのスライサ軸にも NULL の結果がないソース・レコードは複数回カウントされます。
軸のたたみ込みでは、キューブの定義での指定に従い、対象としているメジャーの集約メソッドに基づいて値が組み合わされます (ここの例では、%COUNT が追加されます)。
詳細は、"InterSystems Business Intelligence の実装" の付録 "Business Intelligence クエリ・エンジンの仕組み" にある "軸のたたみ込み" を参照してください。
例
%FILTER 節をメジャー検索式で使用する場合、この節は、ファクト・テーブルの行のうち、指定された条件を満たした行を使用します (メジャー検索式は、インターシステムズによる MDX への拡張機能で、ファクト・テーブル自体のメジャー値を考慮するものです)。
SELECT MEASURES.[%COUNT] ON 0 FROM patients %FILTER %SEARCH.&[[MEASURES].[age]<10]
Patient Count
1,370
%SQLRESTRICT
キューブに対して %SQLRESTRICT ディメンジョンを有効にしている場合、そのキューブに対する MDX クエリに SQL SELECT 文または WHERE 節を含めることができます。これにより、MDX クエリの SQL 文によって実行時の制限を有効にできます。%SQLRESTRICT ディメンジョンを使用するには、以下の構文で %FILTER 節を使用します。
%FILTER %SQLRESTRICT.&[sqlStatement]
sqlStatement は、SQL SELECT 文または SQL WHERE 節です。SELECT 文は、キューブのソース・テーブルから ID のリストを返すように設計する必要があります。これらのID により、最終的な MDX 結果で考慮されるファクトを制限します。最終的な結果には、返される ID リスト内に ID があるレコードに対応するファクトのみが含まれます。sqlStatement に SELECT 文を使用する以下の MDX クエリの例について考えてみます。
SELECT FROM HOLEFOODS
WHERE [Comments].[H1].[Comments].&[SELECT ID FROM HoleFoods.SalesTransaction WHERE ID IN (1,2,3,4)]
外部参照テーブルにクエリを実行することもできます。例えば、以下のような単純なテーブルがあるとします。
ID | Name |
---|---|
1 | Bill |
2 | Sally |
3 | Tom |
4 | Mike |
5 | Teresa |
6 | Alice |
ID | PatientID | Name | Age |
---|---|---|---|
1 | 1 | Bill | 1 |
2 | 6 | Sally | 10 |
3 | 4 | Tom | 45 |
以下の %SQLRESTRICT サブクエリは PatientID 値 1 および 6 を返し、MDX クエリに対して考えられる結果として、キューブ・ソース・テーブルの例で ID 1 と 6 を持つ Bill と Alice のみが残ります。
%SQLRESTRICT.&[SELECT PatientID From Cohort.Table WHERE Age < 35]
上のサンプル・テーブルは非常に単純化されたもので、例を示す目的でのみ使用されています。
%SQLRESTRICT サブクエリは、ソース・テーブルの ID と想定される 1 列の数値を返します。
または、WHERE 節をショートカットとして使用して、ソース・レコードの制限を直接記述することもできます。以下の例を検討します。
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE ID IN (1,2,3,5,10)]
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE Outlet = 24]
SELECT NON EMPTY [DateOfSale].[Actual].[YearSold].Members ON 1
FROM [HOLEFOODS] %FILTER %SQLRESTRICT.&[WHERE YEAR(DateOfSale)='2017']
内部的には、この WHERE 節構文は、MDX クエリでクエリされるキューブのソース・クラスをターゲットとして、システムにより SELECT 文を %SQLRESTRICT サブクエリに挿入します。例えば、Holefoods.SalesTransaction は Holefoods キューブのソース・クラスであるため、以下の 2 つのクエリは同等です。
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[SELECT ID FROM Holefoods.SalesTransaction WHERE ID IN (1,2,3,4)]
SELECT FROM HOLEFOODS %FILTER %SQLRESTRICT.&[WHERE ID IN (1,2,3,4)]
関連項目
"WHERE 節" を参照してください。