使用空值

空值表示某个特定成员、元组或单元为空。 空格值表示指定单元的数据无法在底层事实表中找到,要么该单元格的元组代表了不适用于该立方体的成员组合。

注释

虽然空值与零值不同,但空值通常大多数情况下被视为零。

以下查询说明了空值和零值的行为:

WITH  
//A calculated Product Category that always returns 0  
MEMBER [Product].[Category].[All Products].ReturnZero AS 0  
//Will return true for any null value  
MEMBER MEASURES.ISEMPTYDemo AS ISEMPTY([Measures].[Internet Tax Amount])  
//Will true for any null or zero value  
//To be clear: the expression 0=null always returns true in MDX  
MEMBER MEASURES.IsZero AS [Measures].[Internet Tax Amount]=0  
SELECT  
{[Measures].[Internet Tax Amount],MEASURES.ISEMPTYDemo,MEASURES.IsZero}  
ON COLUMNS,  
[Product].[Category].[Category].ALLMEMBERS  
ON ROWS  
FROM [Adventure Works]  
WHERE([Date].[Calendar].[Calendar Year].&[2001])  

以下信息适用于空值:

  • IsEmpty 函数返回 TRUE 当且仅当函数中指定的元组标识的单元格为空。 否则,函数返回FALSE。

    注释

    IsEmpty 函数无法判断成员表达式是否返回空值。 要判断表达式是否返回空成员,可以使用 IS 操作符。

  • 当空单元格值是任意一个数值算符(+, -, *, /)的操作数时,如果另一个单元数是非空值,则空单元格值被视为零。 如果两个操作数均为空,数值算符返回空格值。

  • 当空单元格值是字符串连接算子(+)的操作数时,如果另一个单元数是非空值,则空单元格值被视为空字符串。 如果两个操作数都是空的,字符串连接算子返回空单元格值。

  • 当空单元格值是任意比较算子的操作数(=. <>, =>, =, ><, , <),空单元格值被视为零或空字符串,具体取决于另一个操作数的数据类型是数字型还是字符串型。 如果两个操作数都为空,则两个操作数都视为零。

  • 在对数值进行对比时,空格值与零在同一位置对比。 在空格值和零之间,空格在零之前会合并。

  • 在整理字符串值时,空单元格值与空字符串在同一位置。 在空格值和空字符串之间,empty 在空字符串之前进行对照。

处理MDX语句和立方体中的空值

在多维表达式(MDX)语句中,你可以寻找空值,然后对数据有效(即非空)的单元格进行某些计算。 在执行计算时剔除空值很重要,因为如果包含空格值,某些计算(如平均值)可能不准确。

如果你底层事实表数据中存储了空值,默认在处理立方体时这些值会被转换为零。 你可以在度量上使用 “零处理 ”选项来控制空事实是否被转换为0、是否变为空值,甚至在处理过程中抛出错误。 如果你不希望查询结果中出现空单元格值,你应该创建查询、计算成员或MDX脚本语句,删除空值或用其他值替换。

要删除查询中的空行或空列,可以在轴集合定义前使用NON EMPTY语句。 例如,以下查询只返回产品类别自行车,因为这是2001年日历年唯一销售的类别:

SELECT  
{[Measures].[Internet Tax Amount]}  
ON COLUMNS,  
//Comment out the following line to display all the empty rows for other Categories  
NON EMPTY  
[Product].[Category].[Category].MEMBERS  
ON ROWS  
FROM [Adventure Works]  
WHERE([Date].[Calendar].[Calendar Year].&[2001])  

更一般地,要从集合中移除空元组,可以使用NonEmpty函数。 以下查询显示了两个计算出的指标,其中一个统计产品类别数量,另一个显示具有度量[互联网税额]和2001年日历年值的产品类别数量:

WITH  
MEMBER MEASURES.CategoryCount AS  
COUNT([Product].[Category].[Category].MEMBERS)  
MEMBER MEASURES.NonEmptyCategoryCountFor2001 AS  
COUNT(  
NONEMPTY(  
[Product].[Category].[Category].MEMBERS  
,([Date].[Calendar].[Calendar Year].&[2001], [Measures].[Internet Tax Amount])  
))  
SELECT  
{MEASURES.CategoryCount,MEASURES.NonEmptyCategoryCountFor2001 }  
ON COLUMNS  
FROM [Adventure Works]  

更多信息请参见NonEmpty(MDX)。

空值与比较算子

当数据中存在空值时,逻辑和比较算子可能会返回第三个EMPTY结果,而不仅仅是TRUE或FALSE。 这种对三值逻辑的需要是导致许多应用程序出错的根源。 这些表格概述了引入空值比较的影响。

下表展示了对两个布尔操作数应用与与算子的结果。

AND TRUE EMPTY FALSE
TRUE FALSE FALSE
空的 FALSE EMPTY FALSE
FALSE FALSE FALSE

下表显示了对两个布尔操作数应用或运算符的结果。

OR TRUE FALSE
TRUE TRUE
空的 TRUE TRUE
TRUE FALSE

下表展示了NOT算子如何抵消或反转布尔算子的结果。

应用NOT算符的布尔表达式 计算结果
TRUE FALSE
EMPTY EMPTY
FALSE TRUE