IIf (MDX)
論理テストによって判別される 2 つの値の 1 つを返します。
構文
IIf(Logical_Expression, Expression1 [HINT <hints>], Expression2 [HINT <hints>]) [HINT <hints>]
<hints> ::= <hint> [<hints>]
<hint> ::= EAGER | STRICT | LAZY
引数
Logical_Expression
true または false に評価される有効な多次元式 (MDX) 論理式です。Expression1 [HINT <hints>]
有効な多次元式 (MDX) 式です。HINT <hints> はオプションの修飾子で、式をいつどのように評価するかを指定します。詳細については、「解説」を参照してください。Expression2[HINT <hints>]
有効な多次元式 (MDX) 式です。HINT <hints> はオプションの修飾子で、式をいつどのように評価するかを指定します。詳細については、「解説」を参照してください。
説明
論理式で指定した式は、式の値が 0 の場合のみ false と評価されます。他のすべての値は、true と評価されます。
指定した論理式が true と評価される場合、IIf 関数は 1 番目の式を返します。それ以外の場合は、2 番目の式を返します。
指定した 2 つの式は値または MDX オブジェクトを返すことができます。また、1 番目と 2 番目の式の型は一致しなくてもかまいません。
注意 |
---|
MicrosoftSQL Server 2000 では、Analysis Services がサポートしていた戻り値のデータ型は数値と文字列だけなので、指定した式の型が一致している必要がありました。これらの制限事項は、SQL ServerAnalysis Services には適用されません。 |
検索条件に基づいてメンバのセットを作成する場合、IIf 関数を使用することはお勧めできません。代わりに、Filter 関数を使用して、指定されたセットの各メンバを論理式に照らして評価し、メンバのサブセットを返すようにしてください。
注意 |
---|
いずれかの式が NULL と評価される場合、その条件が満たされる場合は結果セットが NULL になります。 |
プラン ヒントは、式の評価方法をエンジンに対して指定するための MDX 言語の拡張機能です。
EAGER を指定すると、式が IIF サブスペース全体で評価されます。
STRICT を指定すると、条件式の結果に基づくサブスペースのみで式が評価されます。
LAZY を指定すると、式がセル単位で評価されます。
ヒントで EAGER と STRICT を同時に使用することはできません。同じ IIF(,,) の別の式で使用することはできます。
詳細については、「SQL Server 2008 Analysis Services における MDX のパフォーマンスの向上」を参照してください。
例
次のクエリでは、計算されるメジャー内で 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])