Поделиться через


Пустые значения

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

ПримечаниеПримечание

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

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

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 не может определить, возвращает ли выражение элемента значение NULL. Чтобы определить, возвратило ли выражение элемент NULL, используется оператор IS.

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

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

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

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

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

Пустые значения в инструкциях и кубах многомерных выражений

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

Если пустые значения хранятся среди данных основной таблицы фактов, по умолчанию они будут преобразованы в нули при обработке куба. С помощью параметра Обработка значений NULL для меры можно задать обработку фактов со значением NULL: преобразование в 0, в ние пустое значение или даже формирование ошибки во время обработки. Если пустые ячейки не должны отображаться в результатах запроса, следует создавать запросы, вычисляемые элементы или инструкции сценариев многомерных выражений, которые исключают пустые значения или заменяют их другим значением.

Для удаления пустых строк или столбцов из запроса можно использовать инструкцию 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 (многомерные выражения).

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

Когда в данных содержатся пустые значения, логические операторы и операторы сравнения могут потенциально возвращать третий результат EMPTY вместо значений TRUE и FALSE. Эта тройственная логика является источником многих проблем в приложениях. В таблицах ниже содержатся сведения о результатах сравнений пустых значений.

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

AND

TRUE

EMPTY

FALSE

TRUE

TRUE

FALSE

FALSE

EMPTY

FALSE

EMPTY

FALSE

FALSE

FALSE

FALSE

FALSE

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

OR

TRUE

FALSE

TRUE

TRUE

TRUE

EMPTY

TRUE

TRUE

FALSE

TRUE

FALSE

В следующей таблице показаны результаты отрицания (перемены знака) логического операнда оператором NOT.

Логическое выражение, над которым выполняется оператор NOT

Принимаемое значение

TRUE

FALSE

EMPTY

EMPTY

FALSE

TRUE