空の値の操作

空の値は、特定のメンバー、タプル、またはセルが空であることを示します。 空セル値は、指定されたセルのデータが基礎となるファクトテーブルに存在しないか、指定セルのタプルがキューブに適用されないメンバーの組み合わせを表していることを示します。

Note

空の値はゼロの値とは異なりますが、空の値はほとんどの場合ゼロとして扱われます。

以下のクエリは、空値とゼロ値の挙動を示しています。

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を返します。

    Note

    IsEmpty関数は、メンバー式がnull値を返すかどうかを判定できません。 式からnullメンバーが返されるかどうかを判別するには、 IS 演算子を使用します。

  • 空セルの値が数値演算子のいずれかのオペランド(+, -, *, /)の場合、空セルの値が空でない場合、その空セル値はゼロとみなされます。 両方のオペランドが空の場合、数値演算子は空セルの値を返します。

  • 空セルの値が文字列連結演算子(+)のオペランドである場合、他のオペランドが空でない場合、空セル値は空文字列として扱われます。 両方のオペランドが空の場合、文字列連結演算子は空セルの値を返します。

  • 空セルの値が比較演算子のいずれかのオペランド(=. <>, >=, <=, >, <)である場合、空セル値は、もう一方のオペランドのデータ型が数値型か文字列型かによって、ゼロまたは空文字列として扱われます。 両方のオペランドが空であれば、両方のオペランドはゼロとして扱われます。

  • 数値値を集約する際、空セルの値はゼロと同じ場所に集まります。 空セルの値とゼロの間で、空セルはゼロより先に集まります。

  • 文字列の値を照合する際、空セルの値は空文字列と同じ場所に集まります。 emptyセルの値とempty文字列の間で、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関数を使うことができます。 以下のクエリは2つの計算された指標を示しており、そのうち1つは製品カテゴリの数をカウントし、もう1つは指標[インターネット税額]および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結果を返すことが可能です。 このような 3 値論理が必要な場合、多くのアプリケーション エラーの原因になります。 これらの表は、空の価値比較を導入した場合の効果を示しています。

この表は、2つのブールオペランドにAND演算子を適用した結果を示しています。

AND TRUE EMPTY FALSE
真 TRUE FALSE FALSE
空っぽ FALSE EMPTY FALSE
偽 FALSE FALSE FALSE

この表は、2つのブールオペランドにOR演算子を適用した結果を示しています。

OR TRUE FALSE
真 TRUE TRUE
空っぽ TRUE TRUE
偽 TRUE FALSE

この表はNOT演算子がブール演算子の結果を否定または逆転させる仕組みを示しています。

NOT演算子を適用するブール式 評価結果
TRUE FALSE
EMPTY EMPTY
FALSE TRUE