将NULL与NULL查询结果区分开来

时间:2009-04-10 08:07:37

标签: sql sql-server database tsql

我在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

4 个答案:

答案 0 :(得分:2)

如果您可以使用测量永远不会采用的值,则可以使用COALESCE()。

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

没有行:@val == null

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

否则是一个vlaid测量

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

嗯,这有点像黑客,但是:

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。