Sql server 计数小于1时返回NULL
如果计数结果小于1,我希望存储的proc在列中返回NULL,否则返回计数值。它是一种反向ISNULLSql server 计数小于1时返回NULL,sql-server,tsql,Sql Server,Tsql,如果计数结果小于1,我希望存储的proc在列中返回NULL,否则返回计数值。它是一种反向ISNULL SELECT *, (SELECT COUNT(*) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB AND RequestStatus < 3) AS OpenRequests FROM RequestDatabase 我当时正在考虑是否可以使用CASE,但出现了一个错误,说明我的CASE不能为null。这
SELECT *,
(SELECT COUNT(*) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB
AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase
我当时正在考虑是否可以使用CASE,但出现了一个错误,说明我的CASE不能为null。这对我很有效,并根据需要返回null
DECLARE @test INT
SET @test = 0
SELECT (CASE WHEN @test < 1 THEN NULL ELSE @test END) --NULL
这适用于我,并根据需要返回NULL
DECLARE @test INT
SET @test = 0
SELECT (CASE WHEN @test < 1 THEN NULL ELSE @test END) --NULL
如果您使用的是支持它的SQL Server版本,IIF immediate If函数将执行此操作。否则,您将不得不对CASE做一些事情,这也是可行的
SELECT *,
(SELECT IIF(COUNT(*) == 0, NULL, COUNT(*)) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase
但正如评论人士所说,这听起来不像是最佳实践。如果需要,请在客户端上转换为null,但不要在t-SQL中执行此操作。如果您使用的是支持此操作的SQL Server版本,IIF immediate if函数将执行此操作。否则,您将不得不对CASE做一些事情,这也是可行的
SELECT *,
(SELECT IIF(COUNT(*) == 0, NULL, COUNT(*)) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase
但正如评论人士所说,这听起来不像是最佳实践。如果需要,请在客户端上转换为null,但不要在t-SQL中进行转换。您可以使用NULLIF函数
SELECT NULLIF(COUNT(*), 0)
FROM TableName
您的计数将为0或大于零,因为您希望小于1的任何内容都为null,这只会使您的值为零,您可以这样编写查询
SELECT *,
(SELECT NULLIF(COUNT(*),0) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB
AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase
您可以使用NULLIF函数
SELECT NULLIF(COUNT(*), 0)
FROM TableName
您的计数将为0或大于零,因为您希望小于1的任何内容都为null,这只会使您的值为零,您可以这样编写查询
SELECT *,
(SELECT NULLIF(COUNT(*),0) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB
AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase
实现这一点的另一种方法是使用SUM1而不是COUNT*
如果在空结果集上运行,As SUM1将返回NULL。另一种实现方法是使用SUM1而不是COUNT*
如果在空结果集上运行,As SUM1将返回NULL。或者行数不同。返回计数为零有什么不对?没有什么,在这种情况下,我在客户端应用程序中处理NULL的方法比强制转换和测试zero更好。除非计数操作失败,否则不应该使用NULL来表示计数的输出。我认为您应该重构您将试图写入的值解释为NULL的方式。我相信您无论如何都需要强制转换。否则,如何获得非零值?因此,唯一的额外步骤是IF,这在任何情况下都是不可避免的。我同意你的所有观点,这将是我的正常路线,但是我希望在这个简单的实现中,我可以将数据格式保留在SQL中。具有打开请求的行将显示其打开请求的计数,否则仅显示其数据库名称。谢谢你的提示!返回计数为零有什么不对?没什么,在这种情况下,我在客户端应用程序中对NULL的处理比对零的强制转换和测试更好。除非计数操作失败,否则不应该使用NULL来表示计数的输出。我认为您应该重构您将试图写入的值解释为NULL的方式。我相信您无论如何都需要强制转换。否则,如何获得非零值?因此,唯一的额外步骤是IF,这在任何情况下都是不可避免的。我同意你的所有观点,这将是我的正常路线,但是我希望在这个简单的实现中,我可以将数据格式保留在SQL中。具有打开请求的行将显示其打开请求的计数,否则仅显示其数据库名称。谢谢你的提示!谢谢,很好的提示,但不属于适当的版本库,很好的提示,但不属于适当的版本选择*,从RequestDB=RequestDatabase.RequestDB和RequestStatus<3的请求中选择SUM1作为来自RequestDatabaseSELECT*的OpenRequests,从RequestDB=RequestDatabase.RequestDB且RequestStatus<3的请求中选择SUM1作为来自RequestDatabase的OpenRequests