IIf (MDX)
Évalue différentes expressions de branche, selon qu'une condition booléenne renvoie true ou false.
Syntaxe
IIf(Logical_Expression, Expression1 [HINT <hints>], Expression2 [HINT <hints>])
Arguments
La fonction IIf utilise trois arguments : iif(<condition>, <then branch>, <else branch>).
Logical_Expression
Condition qui renvoie true (1) ou false (0). Ce doit être une expression logique MDX (Multidimensional Expressions) valide.Expression1 Hint [Eager|Strict|Lazy]]
Utilisé lorsque l'expression logique renvoie true. Expression1 doit être une expression MDX (Multidimensional Expressions) valide.Expression2 Hint [Eager|Strict|Lazy]]
Utilisé lorsque l'expression logique renvoie false. Expression2 doit être une expression MDX (Multidimensional Expressions) valide.
Notes
La condition spécifiée par l'expression logique renvoie false si la valeur de cette expression est zéro. Toutes les autres valeurs renvoient true.
Lorsque la condition est true, la fonction IIf retourne la première expression. Sinon, la fonction retourne la seconde expression.
Les expressions spécifiées peuvent retourner des valeurs ou des objets MDX. De plus, leurs types ne doivent pas obligatoirement correspondre.
La fonction IIf n'est pas conseillée pour créer un jeu de membres à partir de critères de recherche. Il vaut mieux utiliser à la place la fonction Filter pour évaluer chaque membre d'un jeu spécifié par rapport à une expression logique et retourner un sous-ensemble de membres.
[!REMARQUE]
Si l'une des expressions prend la valeur NULL, le jeu de résultats est NULL une fois cette condition satisfaite.
HINT est un modificateur facultatif qui détermine comment et quand l'expression est évaluée. Il vous permet de modifier le plan de requête par défaut en spécifiant la façon dont l'expression est évaluée.
EAGER évalue l'expression dans le sous-espace IIF d'origine.
STRICT évalue l'expression uniquement dans le sous-espace limité créé par l'expression de condition logique.
LAZY évalue l'expression en mode cellule-par-cellule.
Tandis que EAGER et STRICT s'appliquent uniquement aux branches then-else de IIF, LAZY s'applique à toutes les expressions MDX. Toutes les expressions MDX peuvent être suivies par HINT LAZY, qui évaluent cette expression en mode cellule-par-cellule.
EAGER et STRICT s'excluent mutuellement dans l'indicateur ; ils peuvent être utilisés dans la même fonction IIF(,,) sur des expressions différentes.
Pour plus d'informations, consultez Indicateurs de requête de la fonction IIF dans SQL Server Analysis Services 2008 et Plans d'exécution et indicateurs de plan pour la fonction MDX IIF et l'instruction CASE.
Exemples
La requête suivante illustre une utilisation simple de IIF à l'intérieur d'une mesure calculée pour retourner l'une de deux valeurs de chaîne différentes lorsque la mesure Internet Sales Amount est supérieure ou inférieure à $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]
Une utilisation très courante d'IIF est de gérer les erreurs de 'division par zéro' dans les mesures calculées, comme dans l'exemple suivant :
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])
Les éléments suivants sont un exemple de IIF qui retourne l'un des deux jeux à l'intérieur de la fonction Generate pour créer un jeu complexe de tuple sur les lignes :
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])
Enfin, cet exemple indique comment utiliser les indicateurs de plan :
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]