使用T-SQL的排名功能时,包含排名值的列可以为空。
创建结果集视图时可以看到这一点:
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
表示使用排名功能的列可以为空:
EXEC sp_help 'v'
Column_name (...) | Nullable
---------------...-+------------+
... (...) | ...
Rank (...) | Yes
DenseRank (...) | Yes
RowNumber (...) | Yes
哪种情况会导致排名函数返回NULL
?
答案 0 :(得分:8)
视图中的每个基于计算/函数的列似乎都可以为空。 E.g:
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
类似于{{1}}。