Поделиться через


IIf (многомерные выражения)

Вычисляет выражения различных ветвей в зависимости от значения логического условия — true или false.

Синтаксис

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

Аргументы

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

  • Logical_Expression
    Условие, которое принимает значение true (1) или false (0). Должно быть допустимым логическим многомерным выражением.

  • Expression1 Hint [Eager|Strict|Lazy]]
    Используется в случае, если логическое выражение принимает значение true. Expression1 должно быть допустимым логическим многомерным выражением.

  • Expression2 Hint [Eager|Strict|Lazy]]
    Используется в случае, если логическое выражение принимает значение false. Expression2 должно быть допустимым логическим многомерным выражением.

Замечания

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

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

Заданные выражения могут возвращать значения или объекты многомерных выражений. Более того, типы этих выражений не должны обязательно совпадать.

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

ПримечаниеПримечание

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

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

  • EAGER вычисляет выражения на исходном подпространстве IIF.

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

  • LAZY позволяет вычислять выражение в режиме «ячейка за ячейкой».

Указания EAGER и STRICT применяются только к ветви THEN-ELSE IIF, но LAZY применяется ко всем многомерным выражениям. За любым многомерным выражением может следовать HINT LAZY, что приведет к вычислению выражения в режиме «ячейка за ячейкой».

Указания EAGER и STRICT являются взаимоисключающими: их можно использовать в одной функции IIF(,,), только в разных выражениях.

Дополнительные сведения см. в разделах Указания запросов функции IIF в службах SQL Server 2008 Analysis Services и Планы выполнения и указания плана для функции IIF многомерного выражения и инструкции CASE.

Примеры

В следующем запросе показано простое использование функции IIF в вычисляемой мере для получения одного из двух строковых значений в зависимости от значения меры «Продажи через Интернет — сумма продаж» (больше или меньше 10 000 долларов США):

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]

См. также

Справочник

Справочник по функциям многомерных выражений (многомерные выражения)