【问题标题】:Differentiate empty from NULL query results区分空查询结果和 NULL 查询结果
【发布时间】:2009-04-10 08:07:37
【问题描述】:

我在 SQL Server 2005 中有一个包含测量数据的表,如果有的话,每人每年一个值。我的 TSQL 代码在循环中获取这些值并对其进行处理:

...
SET @val = (SELECT measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear)
...

现在,对于某个人和某年,该表可以包含 (i) 有效测量值,(ii) NULL 值或 (iii) 根本没有对应的行。

如何有效区分这些情况? (ii) 和 (iii) 都将导致 @val 为 NULL,因此使用当前代码,它们无法区分...

非常感谢您的任何提示,wwwald

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

    如果您可以使用测量永远无法获取的值,则可以使用 COALESCE()。

    SET @val = (SELECT COALESCE(measurement, someValueThatDoesNotOccur) FROM tbl_data WHERE persid = @curpersid AND yr = @curyear)
    

    无行:@val == null

    测量为 NULL:@val 等于某个值

    还有一个vlaid测量

    【讨论】:

      【解决方案2】:

      也许检查@@ROWCOUNT?但是,这有点冒险,因为您需要确保在检查@@ROWCOUNT之前不要进行任何其他操作(它在大多数操作后更新)。

      或者,读取另一列,例如主键:

      SELECT @val = measurement, @id = id
      FROM tbl_data WHERE persid = @curpersid AND yr = @curyear
      

      现在检查@id - 如果是NULL,则没有行。

      【讨论】:

      • 我更喜欢避免使用@@ROWCOUNT 以使代码更加健壮。如果有人在两者之间插入查询,整个事情就会中断。
      • 我相信我都提出了这一点并提出了一个更安全的选择?
      • 是的,当然。我可能会选择 COALESCE 选项(见下文),因为它允许我继续使用 SET。无论如何,谢谢你的想法!
      【解决方案3】:

      我质疑你为什么要循环播放?循环在 SQL Server 中是一件坏事,因为它是性能杀手。大多数事物都有更好的基于集合的解决方案。如果您告诉我们您在循环中除了设置变量的值之外还做了什么,那么您的问题可能会有更好的解决方案。

      【讨论】:

        【解决方案4】:

        嗯,这有点小技巧,但是:

        SET @val = -99999  -- or some other value that will never occur in the table
        SELECT @val = measurement FROM tbl_data WHERE persid = @curpersid AND yr = @curyear
        

        现在,如果 @val 仍为 -9999,则表示没有行,如果测量值为 null,则为 null。

        【讨论】:

        • 谢谢,COALESCE 解决方案对我来说似乎是最佳选择。它还允许我继续使用 SET,它会在返回多行时警告我...
        猜你喜欢
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2020-12-31
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多