0

只是想知道在 T-sql 存储过程中执行条件 WHERE 子句的最佳方法是什么?我不想使用动态 sql - 我宁愿使用参数化存储过程。

我的参数不能为 NULL,但它们可以是空字符串。如果它们是空字符串,我想“跳过”where 子句的那一部分。

没有 if/else 它看起来像这样;

CREATE PROCEDURE [MyProc]
(
    @Criteria1 nvarchar(50),
    @Criteria2 nvarchar(50),
    @Criteria3 nvarchar(50)
)
AS
SELECT top 250 * FROM [MyTable]
where
Col1 LIKE '%' + @Criteria1 + '%' and
Col2 LIKE '%' + @Criteria2 + '%' and
Col3 LIKE '%' + @Criteria3 + '%' 

出于性能原因,如果该条件是“”(空字符串),我想跳过对特定条件的 LIKE 搜索。

谢谢

4

2 回答 2

1

尝试这个

SELECT top 250 * FROM [MyTable]
where
(@Criteria1 = '' or Col1 LIKE '%' + @Criteria1 + '%') and
(@Criteria2 = '' or Col2 LIKE '%' + @Criteria2 + '%') and
(@Criteria3 = '' or Col3 LIKE '%' + @Criteria3 + '%') 

这是一些测试代码

create table MyTable
(
    id int identity,
    col1 nvarchar(50),
    col2 nvarchar(50),
    col3 nvarchar(50)
)
go

insert into MyTable(col1, col2, col3) values( '', '', '');
insert into MyTable(col1, col2, col3) values( '', '', 'a');
insert into MyTable(col1, col2, col3) values( '', 'a', 'b');
insert into MyTable(col1, col2, col3) values( 'a', 'b', 'c');
insert into MyTable(col1, col2, col3) values( 'b', 'c', '');
insert into MyTable(col1, col2, col3) values( 'c', '', '');

-- select * from MyTable; 
go

CREATE PROCEDURE [MyProc]
(
    @Criteria1 nvarchar(50),
    @Criteria2 nvarchar(50),
    @Criteria3 nvarchar(50)
)
AS
    select  *
    from    MyTable
    where
    (@Criteria1 = '' or Col1 LIKE '%' + @Criteria1 + '%') and
    (@Criteria2 = '' or Col2 LIKE '%' + @Criteria2 + '%') and
    (@Criteria3 = '' or Col3 LIKE '%' + @Criteria3 + '%') 
go

exec MyProc '', '', '';
exec MyProc 'a', '', '';
exec MyProc '', 'a', '';
exec MyProc '', '', 'a';
于 2013-09-09T00:03:00.570 回答
1

您可以使用OR来检查空字符串。

SELECT top 250 * FROM [MyTable]
where
(@Criteria1 = '' or Col1 LIKE '%' + @Criteria1 + '%') and
(@Criteria2 = '' or Col2 LIKE '%' + @Criteria2 + '%') and
(@Criteria3 = '' or Col3 LIKE '%' + @Criteria3 + '%')

对于每个条件,如果@Criteria1 = ''OR 条件将短路并且不评估标准的第二部分(使用 LIKE)。

于 2013-09-09T00:28:52.760 回答