Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 计数小于1时返回NULL_Sql Server_Tsql - Fatal编程技术网

Sql server 计数小于1时返回NULL

Sql 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。这

如果计数结果小于1,我希望存储的proc在列中返回NULL,否则返回计数值。它是一种反向ISNULL

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