空值表示某个特定成员、元组或单元为空。 空格值表示指定单元的数据无法在底层事实表中找到,要么该单元格的元组代表了不适用于该立方体的成员组合。
注释
虽然空值与零值不同,但空值通常大多数情况下被视为零。
以下查询说明了空值和零值的行为:
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 |