我正在尝试做一些应该相当简单的事情,但ISNULL并没有做我想的那样。
基本上我有一个存储过程,我希望PARAM1或PARAM2在我的表中具有匹配值。
SELECT * FROM MyTable WITH (NOLOCK)
WHERE
field1 = ISNULL(@PARAM1 ,field1 )
AND
field2 = @PARAM2
这个工作正常,直到我的行中有NULL字段,然后它排除了那些结果。是否有不同的方法可以满足这一需求?
答案 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)