Sql server 为什么T-SQL排名值返回可为空的列?
使用T-SQL的排名函数时,包含排名值的列可以为空 在创建结果集的视图时可以看到:Sql server 为什么T-SQL排名值返回可为空的列?,sql-server,tsql,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 ListPri
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
?视图中的每个计算列/基于函数的列似乎都可以为NULL。例如:
create view v1
as
select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects
go
EXEC sp_help 'v1'
指示object\u id
不可为空,但obj2
可为空,即使可以观察到ifobject\u id
永远不能为空,也不能obj2
我所知道的强制列显示为不可为null的唯一方法(不确定这是否是您真正想要的)是将其包装在ISNULL
中:
create view v2
as
select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v2'
create view v3
as
select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v3'
有趣的是,这是少数几个不能使用COALESCE
而不是ISNULL
的地方之一:
create view v2
as
select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v2'
create view v3
as
select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects
go
EXEC sp_help 'v3'
v3
类似于v1
视图中的AFAIK计算列与基表中的计算列没有任何区别。