Работа с пустыми значениями

Пустое значение указывает, что конкретный элемент, кортеж или ячейка пусты. Пустое значение ячейки указывает либо на то, что данные для указанной ячейки нельзя найти в базовой таблице фактов, либо что кортеж для указанной ячейки представляет собой комбинацию элементов, неприменимую для куба.

Замечание

Хотя пустое значение отличается от значения нуля, пустое значение обычно рассматривается как ноль.

Следующий запрос иллюстрирует поведение пустых и нулевых значений:

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 .

  • Когда значение пустой ячейки является операндом для любого из числовых операторов (+, -, *, /), значение пустой ячейки считается равным нулю, если другой операнд является непустым значением. Если оба операнда пусты, числовой оператор возвращает пустое значение ячейки.

  • Когда значение пустой ячейки является операндом оператора конкатенации строк (+), значение пустой ячейки рассматривается как пустая строка, если другой операнд является непустым значением. Если оба операнда пусты, оператор конкатенации строк возвращает пустое значение ячейки.

  • Когда значение пустой ячейки является операндом для любого из операторов сравнения (=. <>, >=, <=, >, <), значение пустой ячейки рассматривается как ноль или пустая строка, в зависимости от того, является ли тип данных другого операнда числовым или строковым соответственно. Если оба операнда пусты, оба операнда считаются равными нулю.

  • При сверке числовых значений пустое значение ячейки складывается в том же месте, что и ноль. Между значением пустой ячейки и нулём пустой ячейки складывается перед нулём.

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

Работа с пустыми значениями в операторах MDX и кубах

В операторах многомерных выражений (MDX) можно искать пустые значения и затем выполнять определённые вычисления на ячейках с действительными (то есть не пустыми) данными. Исключение пустых значений при выполнении вычислений может быть важно, поскольку некоторые вычисления, такие как среднее, могут быть неточными, если включать пустые значения ячеек.

Если пустые значения хранятся в базовой таблице фактов, по умолчанию они будут преобразованы в нули при обработке куба. Вы можете использовать опцию Null Processing на мере, чтобы контролировать, преобразуются ли null-факты в 0, преобразуют ли в пустое значение или даже выдают ли ошибки во время обработки. Если вы не хотите, чтобы в результатах запроса появлялись пустые значения ячеек, следует создавать запросы, вычисляемые члены или MDX Script-операторы, которые устраняют пустые значения или заменяют их каким-либо другим.

Чтобы удалить пустые строки или столбцы из запроса, можно использовать оператор 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).

Пустые значения и операторы сравнения

Когда в данных присутствуют пустые значения, логические и сравнительные операторы могут потенциально вернуть третий результат ПУСТОГО вместо просто ИСТИННОГО или ЛОЖНОГО. Эта тройственная логика является источником многих проблем в приложениях. Эти таблицы описывают эффект введения сравнений пустых значений.

В этой таблице показаны результаты применения оператора AND к двум булевым операндам.

AND TRUE ПУСТО FALSE
ИСТИННЫЙ TRUE FALSE FALSE
ПУСТО FALSE ПУСТО FALSE
ЛОЖНЫЙ FALSE FALSE FALSE

В этой таблице показаны результаты применения оператора OR к двум булевым операндам.

OR TRUE FALSE
ИСТИННЫЙ TRUE TRUE
ПУСТО TRUE TRUE
ЛОЖНЫЙ TRUE FALSE

В этой таблице показано, как оператор NOT отрицает или отменяет результат булевого оператора.

Булевое выражение, к которому применяется оператор NOT Результат
TRUE FALSE
ПУСТО ПУСТО
FALSE TRUE