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

标签 sql-server tsql

使用T-SQL的排名函数时,包含排名值的列可以为空。

您可以在创建结果集 View 时看到这一点:

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

为此 View 执行 sp_help 表明使用排名函数的列可为空:

EXEC sp_help 'v'

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

哪种情况会导致排名函数返回 NULL

最佳答案

View 中每个基于计算/函数的列似乎都可以为空。例如:

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

表示 object_id 不可为空,但 obj2 可以为空,即使可以简单地观察到 if 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

关于sql-server - 为什么 T-SQL 排名值返回可为空的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007958/

相关文章:

sql - 根据所选数据返回不同的值

sql-server - 如何计算 SQL Server 中的到期日期?

mysql - SQL 计数功能不适用于连接查询

sql - 改进 sql 中的文本搜索

sql - TSQL:在 BEGIN...END block 中执行存储过程

sql-server-2008 - 如何找到字符串中最长的字母序列

sql - 将 MIN 聚合函数应用于 BIT 字段

c# - 如何创建t-sql来加载下n条记录?

sql-server - SSDT 禁用重命名 - 重构日志

java - 在 spring 中使用 SQLServerConnectionPoolDataSource