【问题标题】:Return NULL when a COUNT is less than 1当 COUNT 小于 1 时返回 NULL
【发布时间】: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 中保留数据格式。具有“打开请求”的行将显示其打开请求的计数,否则仅显示其数据库名称。感谢您的所有提示!

标签: sql-server tsql


【解决方案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 中这样做。

      【讨论】:

      • 谢谢,不错的提示,但不是合适的版本
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2017-04-15
      • 2017-07-19
      相关资源
      最近更新 更多