当 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 < 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的主要内容,如果未能解决你的问题,请参考以下文章
在使用 map 循环遍历数组时返回 null 而不是 JSX
当查询返回多个 min(count) 数据时,如何从不同表中选择所有行