Пустые значения
Пустое значение показывает, что элемент, кортеж или ячейка пуста. Пустое значение ячейки показывает либо то, что данные для указанной ячейки не удалось обнаружить в базовой таблице фактов, либо то, что кортеж для заданной ячейки представляет сочетание элементов, неприменимое для куба.
Примечание |
---|
Хотя пустое значение отличается от нулевого значения, в большинстве случаев оно интерпретируется как ноль. |
Следующий запрос иллюстрирует поведение пустых и нулевых значений:
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 |