为什么T-SQL排名值会返回可为空的列?

时间:2011-08-10 08:35:37

标签: sql-server tsql

使用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

1 个答案:

答案 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不可为空,但obj2object_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}}。