IIf (многомерные выражения)
Вычисляет выражения различных ветвей в зависимости от значения логического условия — true или false.
Синтаксис
IIf(Logical_Expression, Expression1 [HINT <hints>], Expression2 [HINT <hints>])
Аргументы
Функция IIf принимает три аргумента: iif(<condition, then branch, <<else branch>>).>
Logical_Expression
Условие, которое оценивается как true (1) или false (0). Должно быть допустимым логическим многомерным выражением.
Указание Expression1 [охотно|Строгий|Ленивый]]
Используется, когда логическое выражение оценивается как true. Expression1 должно быть допустимым логическим многомерным выражением.
Указание Expression2 [охотно|Строгий|Ленивый]]
Используется, когда логическое выражение оценивается как false. Expression2 должно быть допустимым логическим многомерным выражением.
Замечания
Условие, указанное логическим выражением, имеет значение false , если значение этого выражения равно нулю. Любое другое значение имеет значение true.
Если условие имеет значение true, функция IIf возвращает первое выражение. В противном случае функция возвращает второе выражение.
Заданные выражения могут возвращать значения или объекты многомерных выражений. Более того, типы этих выражений не должны обязательно совпадать.
Функция IIf не рекомендуется создавать набор элементов на основе критериев поиска. Вместо этого используйте функцию фильтра , чтобы оценить каждый элемент в указанном наборе по логическому выражению и вернуть подмножество элементов.
Заметка
Если любое из выражений возвращает значение NULL, результирующий набор будет содержать значение NULL, если будет выполнено условие, соответствующее этому выражению.
Hint — необязательный модификатор, определяющий, как и когда вычисляется выражение. Оно позволяет переопределить план запроса по умолчанию, указав, как вычисляется выражение.
EAGER вычисляет выражения на исходном подпространстве IIF.
STRICT вычисляет выражение только в ограниченном подпространстве, созданном логическим условным выражением.
LAZY позволяет вычислять выражение в режиме «ячейка за ячейкой».
Указания EAGER и STRICT применяются только к ветви THEN-ELSE IIF, но LAZY применяется ко всем многомерным выражениям. За любым многомерным выражением может следовать HINT LAZY, что приведет к вычислению выражения в режиме «ячейка за ячейкой».
Указания EAGER и STRICT являются взаимоисключающими: их можно использовать в одной функции IIF(,,), только в разных выражениях.
Дополнительные сведения см . в указаниях по запросу функции IIF в SQL Server Analysis Services 2008 и планах выполнения и указаниях по плану для функции многомерных выражений IIF и инструкции CASE.
Примеры
В следующем запросе показано простое использование 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]
См. также
Справочник по функции многомерных выражений (многомерные выражения)