IIf (MDX)
ブール条件が true か false かに応じて、異なる分岐の式を評価します。
構文
IIf(Logical_Expression, Expression1 [HINT <hints>], Expression2 [HINT <hints>])
引数
IIf 関数には、iif (<条件>、<then 分岐>、<else 分岐>) のように、3 つの引数が使用されます。
Logical_Expression
true (1) または false (0) と評価される条件。 有効な多次元式 (MDX) の論理式を指定する必要があります。Expression1 Hint [Eager|Strict|Lazy]]
論理式が true と評価された場合に使用されます。 Expression1 には、有効な多次元式 (MDX) を指定する必要があります。Expression2 Hint [Eager|Strict|Lazy]]
論理式が false と評価された場合に使用されます。 Expression2 には、有効な多次元式 (MDX) を指定する必要があります。
説明
論理式で指定された条件は、この式の値が 0 の場合、false と評価されます。 他の値の場合は、true と評価されます。
条件が true の場合、IIf 関数は 1 番目の式を返します。 それ以外の場合は、2 番目の式を返します。
指定した 2 つの式は値または MDX オブジェクトを返すことができます。 また、1 番目と 2 番目の式の型は一致しなくてもかまいません。
検索条件に基づいてメンバーのセットを作成する場合、IIf 関数を使用することはお勧めできません。 代わりに、Filter 関数を使用して、指定されたセットの各メンバーを論理式に照らして評価し、メンバーのサブセットを返すようにしてください。
注 |
---|
いずれかの式が NULL と評価される場合、その条件が満たされる場合は結果セットが NULL になります。 |
Hint はオプションの修飾子で、式をいつどのように評価するかを指定します。 これを使用すると、式の評価方法を指定することにより、既定のクエリ プランをオーバーライドすることができます。
EAGER を指定すると、式は元の IIF サブ空間で評価されます。
STRICT を指定すると、論理条件式によって作成された制限付きのサブ空間のみで式が評価されます。
LAZY を指定すると、式はセル単位で評価されます。
EAGER と STRICT は IIF の then-else 分岐のみに適用され、LAZY はすべての MDX 式に適用されます。 MDX 式の後には、セル単位でその式を評価する HINT LAZY を指定できます。
ヒントで EAGER と STRICT を同時に使用することはできません。同じ IIF(,,) の別の式で使用することはできます。
詳細については、「SQL Server Analysis Services 2008 の IIF 関数のクエリ ヒント」および「MDX の IIF 関数と CASE ステートメントの実行プランおよびプラン ヒント」を参照してください。
使用例
次のクエリでは、計算されるメジャー内で IIF を使用して、Internet Sales Amount メジャーが 10,000 米ドルを上回るか下回る場合に異なる 2 つの文字列値のいずれかを返す簡単な方法を示します。
WITH MEMBER MEASURES.IIFDEMO AS
IIF([Measures].[Internet Sales Amount]>10000
, "Sales Are High", "Sales Are Low")
SELECT {[Measures].[Internet Sales Amount],MEASURES.IIFDEMO} ON 0,
[Date].[Date].[Date].MEMBERS ON 1
FROM [Adventure Works]
IIF の一般的な使用方法では、次の例に示すように、計算されるメンバー内で "0 除算" エラーを処理します。
WITH
//Returns 1.#INF when the previous period contains no value
//but the current period does
MEMBER MEASURES.[Previous Period Growth With Errors] AS
([Measures].[Internet Sales Amount]-([Measures].[Internet Sales Amount], [Date].[Date].CURRENTMEMBER.PREVMEMBER))
/
([Measures].[Internet Sales Amount], [Date].[Date].CURRENTMEMBER.PREVMEMBER)
,FORMAT_STRING='PERCENT'
//Traps division by zero and returns null when the previous period contains
//no value but the current period does
MEMBER MEASURES.[Previous Period Growth] AS
IIF(([Measures].[Internet Sales Amount], [Date].[Date].CURRENTMEMBER.PREVMEMBER)=0,
NULL,
([Measures].[Internet Sales Amount]-([Measures].[Internet Sales Amount], [Date].[Date].CURRENTMEMBER.PREVMEMBER))
/
([Measures].[Internet Sales Amount], [Date].[Date].CURRENTMEMBER.PREVMEMBER)
),FORMAT_STRING='PERCENT'
SELECT {[Measures].[Internet Sales Amount],MEASURES.[Previous Period Growth With Errors], MEASURES.[Previous Period Growth]} ON 0,
DESCENDANTS(
[Date].[Calendar].[Calendar Year].&[2004],
[Date].[Calendar].[Date])
ON 1
FROM [Adventure Works]
WHERE([Product].[Product Categories].[Subcategory].&[26])
次に示す IIF の例では、Generate 関数内で 2 つのセットのうちいずれかを返して行に複雑な組のセットを作成します。
SELECT {[Measures].[Internet Sales Amount]} ON 0,
//If Internet Sales Amount is zero or null
//returns the current year and the All Customers member
//else returns the current year broken down by Country
GENERATE(
[Date].[Calendar Year].[Calendar Year].MEMBERS
, IIF([Measures].[Internet Sales Amount]=0,
{([Date].[Calendar Year].CURRENTMEMBER, [Customer].[Country].[All Customers])}
, {{[Date].[Calendar Year].CURRENTMEMBER} * [Customer].[Country].[Country].MEMBERS}
))
ON 1
FROM [Adventure Works]
WHERE([Product].[Product Categories].[Subcategory].&[26])
最後に、この例では、プラン ヒントを使用する方法を示します。
WITH MEMBER MEASURES.X AS
IIF(
[Measures].[Internet Sales Amount]=0
, NULL
, (1/[Measures].[Internet Sales Amount]) HINT EAGER)
SELECT {[Measures].x} ON 0,
[Customer].[Customer Geography].[Country].MEMBERS ON 1
FROM [Adventure Works]