当 COUNT 小于 1 时返回 NULL

Posted

技术标签:

【中文标题】当 COUNT 小于 1 时返回 NULL【英文标题】:Return NULL when a COUNT is less than 1 【发布时间】:2014-09-22 21:13:29 【问题描述】:

如果 COUNT 结果小于 1,我希望我的存储过程在列中返回 NULL,否则返回 COUNT 值。这是一种反向ISNULL???

SELECT *, 
(SELECT COUNT(*) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB 
    AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase

我在想也许可以使用 CASE WHEN,但我收到一条错误消息,指出我的 CASE 不能为空。

【问题讨论】:

返回零计数有什么问题? 没什么,在这种情况下,我在客户端应用程序中处理空值比强制转换和测试为零更好 除非计数操作失败,否则不应使用NULL 表示计数的输出。我认为你应该重构你解释你试图写的值的方式NULL 我相信无论如何你都需要投射。否则,您如何获得非零值?所以唯一的额外步骤是你的IF,这在任何情况下都是不可避免的。 我同意你的所有观点,这将是我的正常路线,但是我希望在这个简单的实现中,我可以在 SQL 中保留数据格式。具有“打开请求”的行将显示其打开请求的计数,否则仅显示其数据库名称。感谢您的所有提示! 【参考方案1】:

你可以使用NULLIF()函数。

SELECT NULLIF(COUNT(*), 0)
FROM TableName

您的计数将是 0 或大于零,因为您希望任何小于 1 的东西都为空,这使您只有零值,您可以像这样编写查询...

SELECT *, 
(SELECT NULLIF(COUNT(*),0) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB 
    AND RequestStatus < 3) AS OpenRequests
FROM RequestDatabase

【讨论】:

【参考方案2】:

实现此目的的另一种方法是使用SUM(1) 而不是COUNT(*)

如果SUM(1) 在空结果集上运行,无论如何都会返回NULL。或者行数。

【讨论】:

SELECT *, (SELECT SUM(1) FROM Requests WHERE RequestDB = RequestDatabase.RequestDB AND RequestStatus &lt; 3) AS OpenRequests FROM RequestDatabase【参考方案3】:

这对我有用,并根据需要返回 NULL

DECLARE @test INT
SET @test = 0

SELECT (CASE WHEN @test < 1 THEN NULL ELSE @test END) --NULL

【讨论】:

【参考方案4】:

如果您使用的是支持它的 SQL Server 版本,IIF(立即 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 中这样做。

【讨论】:

谢谢,不错的提示,但不是合适的版本

以上是关于当 COUNT 小于 1 时返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

mysql--返回第N高的薪水(不存在返回null)

leetcode-204-Count Primes

在使用 map 循环遍历数组时返回 null 而不是 JSX

当查询返回多个 min(count) 数据时,如何从不同表中选择所有行

SQL LEFT JOIN 与返回 NULL 值的 COUNT

C: read/write