0

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

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

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

这工作正常,直到我的行中有 NULL 字段,然后它排除了这些结果。有没有其他方法可以解决这个问题?

4

3 回答 3

2

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

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

我想你也可以以这种方式使用 ISNULL:

ISNULL(Field1, @PARAM1) = @PARAM1
于 2011-05-12T15:05:12.643 回答
1

采用

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL)

这将评估为-

如果 @PARAM1 不为空,则 field1 = @PARAM1。

如果@PARAM1 为空,则 field1 = A_REPLACEMENT_VALUE_IF_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))

或者

--To get all rows with field1/2 as PARAM1/2 and ignore everything else
field1 = @PARAM1 OR field2 = @PARAM2
于 2011-05-12T15:07:05.617 回答
1

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

SELECT * FROM MyTable WITH (NOLOCK)
        WHERE      
        (PARAM1 = @PARAM1 or PARAM1 is null)
        AND        
        (PARAM2 = @PARAM2 or PARAM2 is null)
于 2011-05-12T15:11:18.440 回答