ISNULL用于NULL数据库字段

时间:2011-05-12 15:02:13

标签: tsql stored-procedures isnull

我正在尝试做一些应该相当简单的事情,但ISNULL并没有做我想的那样。

基本上我有一个存储过程,我希望PARAM1或PARAM2在我的表中具有匹配值。

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

这个工作正常,直到我的行中有NULL字段,然后它排除了那些结果。是否有不同的方法可以满足这一需求?

3 个答案:

答案 0 :(得分:2)

ISNULL用第二个值替换第一个值,因此只有当参数@ PARAM1为NULL时,它才会用PARAM1替换它。我假设你没有传入NULL值,所以这可能不是你想要的。你更有可能只想说

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

我假设您也可以这种方式使用ISNULL:

ISNULL(Field1, @PARAM1) = @PARAM1

答案 1 :(得分:1)

使用

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL)

这将评估为 -

field1 = @ PARAM1,如果@ PARAM1不是NULL。

field1 = 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

答案 2 :(得分:1)

null在sql中很特殊。如果对列进行任何比较,则将排除对该列具有空值的任何行。

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