2009-04-10 87 views
2

我有一張SQL Server 2005中的測量數據表,如果有的話,每個人和每年一個值。我的TSQL代碼在一個循環中獲取這些值和它們的方法:現在從NULL查詢結果中區分空

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

,爲某個人而今年,該表可以包含(I)的有效測量,(II)NULL值或(iii)根本沒有相應的行。

如何有效區分這些情況?兩者(II)和(iii)將導致@val被空,因此與當前的代碼,它們無法區分...

感謝一大堆任何提示,wwwald

回答

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。

1

或許檢查@@ROWCOUNT ?但是,這有點冒險,因爲在檢查@@ROWCOUNT(在大多數操作後更新)之前,您必須確保不要執行任何其他操作。

另外,讀另一列,如主鍵:

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

現在檢查@id - 如果它是NULL,沒有行。

+0

我寧願避免使用@@ ROWCOUNT來使代碼更健壯。如果有人在兩者之間插入查詢,整個事情就會中斷。 – wwwald 2009-04-10 08:35:17

+0

我相信我都提出了這一點,並提出了一個更安全的選擇? – 2009-04-10 08:39:50

2

如果您可以使用測量永遠不會採用的值,可以使用COALESCE()。

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

沒有行:@val == NULL

測量NULL:@val等於someValue中

別的一個vlaid測量

1

我問你爲什麼循環?循環在SQL Server中是一件壞事,因爲它是一個性能殺手。大多數東西都有更好的基於集合的解決方案。也許你的問題有更好的解決方案,如果你告訴我們除了設置變量的值之外你在循環中做了什麼。