SQL:取消null参数的'where'

Chr*_*ris 6 sql t-sql

这可能很明显,但我很困惑.

我有一个带有where子句的SQL查询(其中包含参数列表).如果所有这些参数都为null,我需要SQL忽略where子句并检索所有记录.在SQL中这很容易吗?我知道一种方法是,如果参数为null,只需使用代码删除where子句.

Mar*_*ith 5

最高效的方法是根本不包括该WHERE条款,如果这是你的选择.

您经常会看到使用过的技巧,WHERE X=@X OR @X IS NULL但如果您传递特定值,这些技巧会导致次优计划和不必要的表扫描@X

编辑:

由于这个答案似乎遇到了一些意想不到的怀疑......

create table #t
(
id varchar(5) primary key /*varchar to test LIKE without causing any casts*/
)

INSERT INTO #t
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM sys.all_columns


SET STATISTICS IO ON
/*Test the equals */

EXEC sp_executesql N'
SELECT * 
FROM #t
WHERE (@id IS NULL OR id = @id)', N'@id varchar(5)', @id='1'

/*Is `LIKE` any better? */

EXEC sp_executesql N'
SELECT * 
FROM #t
WHERE (@id IS NULL OR id LIKE @id)', N'@id varchar(5)', @id='1'

/*What should the plan look like? */

EXEC sp_executesql N'
SELECT * 
FROM #t
WHERE (id = @id)', N'@id varchar(5)', @id='1'

DROP TABLE #t
Run Code Online (Sandbox Code Playgroud)

执行计划


Jan*_*n_V 5

你可以尝试做这样的事情:

select *
from foo
where (@parameter1 is null AND @parameter2 is null)
OR  (@parameter1 = 'value1'
    AND
    @parameter2 = 'value2')
Run Code Online (Sandbox Code Playgroud)

在你自己的查询中需要进行一些调整,但是现在你将检查参数是否为null或者是否使用原始where子句.