2011-05-12 48 views
0

我正在嘗試做一些應該相當簡單的事情,但ISNULL並沒有做我認爲會的事情。ISNULL與NULL數據庫字段的用法

基本上我有一個存儲過程,我期待PARAM1或PARAM2在我的表中有一個匹配的值。

SELECT * FROM MyTable WITH (NOLOCK) 
     WHERE  
     field1 = ISNULL(@PARAM1 ,field1) 
     AND   
     field2 = @PARAM2 

這工作正常,直到我有我的行中的NULL字段,然後它排除這些結果。有不同的方法可以滿足這個需求嗎?

回答

2

ISNULL將第一個值替換爲第二個值,所以只有當您的參數@ PARAM1爲NULL時,它纔會用PARAM1替換它。我假設你沒有傳遞NULL值,所以這可能不是你想要的。更有可能的是,你只想說

WHERE 
(Field1 = @PARAM1 OR Field1 IS NULL) 
AND 
Field2 = @Param2 

我想你可以用這種方式也使用ISNULL:

ISNULL(Field1, @PARAM1) = @PARAM1 
+0

不可以.OP傳入'@ PARAM1'或'@ PARAM2',他們希望參數NULL是有效的No-OP。除非PARAM1 =''的行爲不會排除列爲NULL的行。 – 2011-05-12 15:07:54

+0

參數1或2可以爲空。我只傳入了我感興趣的參數,另一個設置爲NULL – Andrew 2011-05-12 15:08:11

+0

Martin,這就是我所說的。如果列值爲NULL(如他所說,「直到我的行中有NULL字段」),@ PARAM1(不會爲NULL)將不匹配它。所以他需要使用列值的ISNULL,或者檢查Param1是否爲NULL。 – Ryan 2011-05-12 15:15:16

1

使用

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL) 

這將評估TO-

FIELD1 = @ PARAM1如果@ PARAM1不爲NULL。

字段1 = A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL如果@ PARAM1 IS NULL

編輯:

嘗試這些:

--If you want to ignore the WHERE clause if PARAM1/2 is null 
ISNULL(field1, DEFAULT_VALUE) = ISNULL(@PARAM1, ISNULL(field1, DEFAULT_VALUE)) 
OR 
ISNULL(field2, DEFAULT_VALUE) = ISNULL(@PARAM2, ISNULL(field2, DEFAULT_VALUE)) 

OR

--To get all rows with field1/2 as PARAM1/2 and ignore everything else 
field1 = @PARAM1 OR field2 = @PARAM2 
+0

這就是我正在做的事,雖然不是嗎? – Andrew 2011-05-12 15:10:08

+0

@Andi嘗試ISNULL(PARAM1,DEFAULT_VALUE)= ISNULL(@ PARAM1,DEFAULT_VALUE) – Lobo 2011-05-12 15:13:17

+1

@Andi爲什麼你不能試試PARAM1 = @ PARAM1或PARAM2 = @ PARAM2? – Lobo 2011-05-12 15:18:02

1

空在SQL特殊。如果您在列上進行任何比較,那麼將排除該列中具有空值的任何行。

SELECT * FROM MyTable WITH (NOLOCK) 
     WHERE  
     (PARAM1 = @PARAM1 or PARAM1 is null) 
     AND   
     (PARAM2 = @PARAM2 or PARAM2 is null)