这可能很明显,但我很困惑.
我有一个带有where子句的SQL查询(其中包含参数列表).如果所有这些参数都为null,我需要SQL忽略where子句并检索所有记录.在SQL中这很容易吗?我知道一种方法是,如果参数为null,只需使用代码删除where子句.
最高效的方法是根本不包括该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)
你可以尝试做这样的事情:
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子句.
| 归档时间: |
|
| 查看次数: |
2425 次 |
| 最近记录: |