带有OR和NULL值的SQL WHERE条件

时间:2017-02-28 07:58:53

标签: sql tsql

我正在创建一个存储过程,其中所有参数都将在WHERE条件中使用。

当我有一个像

这样的查询时,我知道如何处理空值
WHERE value1 = val1 AND value2 = val2 AND value3 = val3

处理空值:

WHERE (value1 is null OR value1 = val1) 
AND (value2 is null OR value2 = val2) 
AND (value3 is null OR value3 = val3) 

但我应该如何使用OR进行查询?

WHERE value1 = val1 OR value2 = val2 OR value3 = val3

显然这不起作用,因为我将获得所有行

WHERE (value1 is null OR value1 = val1) 
OR (value2 is null OR value2 = val2) 
OR (value3 is null OR value3 = val3) 

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

假设value1 ... value3应该代表参数,并且您正在尝试编写带有可选参数的过程......

你想要

WHERE   (@value1 is null OR @value1 = val1) 
    AND (@value2 is null OR @value2 = val2) 
    AND (@value3 is null OR @value3 = val3) 

您应该考虑添加

OPTION (RECOMPILE)

因为这些"赶上所有"查询因没有的最佳执行计划而臭名昭着。

答案 1 :(得分:0)

只要使用ISNULL函数,如果第一个值为NULL,它将返回第二个值。例如:

WHERE ISNULL(value1,*some_value*) = val1 
OR ISNULL(value2,*some_value*) = val2 
OR ISNULL(value3,*some_value*) = val3