IIf (MDX)

Оценивает разные выражения ветвей в зависимости от того, истинно ли булево условие истинно или ложно.

Syntax

  
IIf(Logical_Expression, Expression1 [HINT <hints>], Expression2 [HINT <hints>])  

Arguments

Функция IIf принимает три аргумента: iif(condition, затем ветвляться>, <иначе ветвляться>). <><

Logical_Expression
Условие, которое оценивается как истинное (1) или ложное (0). Это должно быть действительное логическое выражение многомерных выражений (MDX).

Подсказка Expression1 [С нетерпением|Строгие|ленивы]]
Используется, когда логическое выражение вычисляется в true. Выражение 1 должно быть действительным выражением многомерных выражений (MDX).

Подсказка Expression2 [С нетерпением|Строгие|ленивы]]
Используется, когда логическое выражение вычисляется в false. Выражение 2 должно быть действительным выражением многомерных выражений (MDX).

Remarks

Условие, заданное логическим выражением, оценивается как ложное , когда значение этого выражения равно нулю. Любое другое значение оценивается в true.

Когда условие истинно, функция IIf возвращает первое выражение. В противном случае функция возвращает второе выражение.

Указанные выражения могут возвращать значения или MDX-объекты. Кроме того, указанные выражения не обязательно должны совпадать по типу.

Функция IIf не рекомендуется для создания набора членов на основе критериев поиска. Вместо этого используйте функцию Filter , чтобы вычислить каждый элемент в заданном наборе по логическому выражению и вернуть подмножество членов.

Замечание

Если одно из выражений вычисляется в NULL, результат будет NULL при выполнении этого условия.

Подсказка — это необязательный модификатор, определяющий, как и когда вычисляется выражение. Он позволяет переопределить план запроса по умолчанию, указывая, как вычисляется выражение.

  • EAGER оценивает выражение по исходному подпространству IIF.

  • STRICT оценивает выражение только в ограниченном подпространстве, созданном логическим выражением условий.

  • LAZY оценивает экспрессию в индивидуальном режиме.

В то время как EAGER и STRICT применимы только к ветвям IIF, LAZY применяется ко всем выражениям MDX. Любое выражение MDX может сопровождаться HINT LAZY, который оценивает эту экспрессию в режиме клетки за ячейкой.

EAGER и STRICT взаимоисключают в подсказке; они могут использоваться в одном и том же IIF(,,) над разными выражениями.

Для получения дополнительной информации см. IIF Function Query Hints in SQL Server Analysis Services 2008 и Execution Plans and Plan Hints for MDX IIF Function and CASE Statement.

Примеры

Следующий запрос показывает простое использование IIF внутри рассчитанной меры для возврата одного из двух различных строковых значений, если сумма интернет-продаж превышает или превышает $10000:

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 — обработка ошибок «деления на ноль» в вычисленных измерениях, как в следующем примере:

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 для создания комплексного набора кортежей на строках:

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]