我正在创建一个存储过程,其中所有参数都将在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)
我该如何解决这个问题?
答案 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