Почему значения ранжирования T-SQL возвращают пустые столбцы? - PullRequest
9 голосов
/ 10 августа 2011

При использовании функций ранжирования T-SQL столбец, содержащий значения ранжирования, может иметь значение null.

Это можно увидеть при создании представления набора результатов:

CREATE VIEW v
AS 
  SELECT Name
    , ListPrice
    , RANK() OVER (ORDER BY ListPrice DESC) AS [Rank]
    , DENSE_RANK() OVER (ORDER BY ListPrice DESC) AS [DenseRank]
    , ROW_NUMBER() OVER (ORDER BY ListPrice DESC) AS [RowNumber]
FROM Production.Product

Выполнениеsp_help для этого представления указывает, что столбцы, использующие функции ранжирования, могут иметь значение null:

EXEC sp_help 'v'

Column_name   (...) | Nullable
---------------...-+------------+
...           (...) | ...
Rank          (...) | Yes
DenseRank     (...) | Yes
RowNumber     (...) | Yes

Какое условие приведет к тому, что функция ранжирования вернет NULL?

1 Ответ

8 голосов
/ 10 августа 2011

Каждый вычисляемый / основанный на функции столбец в представлении выглядит обнуляемым.Например:

create view v1
as
    select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects
go
EXEC sp_help 'v1'

Обозначает, что object_id не обнуляемо, а obj2, хотя тривиально наблюдаемо, что, если object_id никогда не может быть нулевым, или obj2.

Единственный способ, которым я знаю (не уверен, действительно ли это то, что вам нужно), заставить столбец выглядеть не обнуляемым, - это обернуть его в ISNULL:

create view v2
as
    select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v2'

Интересно, что это одно из немногих мест, где вы не можете использовать COALESCE вместо ISNULL:

create view v3
as
    select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v3'

v3 напоминает v1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...