If-Else在T-SQL where子句中

时间:2013-09-08 23:52:27

标签: tsql stored-procedures

只是想知道在T-sql sproc中执行条件WHERE子句的最佳方法是什么?我不想使用动态sql - 我宁愿使用paramaterised sproc。

我的参数不能为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搜索特定条件。

感谢

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分: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)将不会被评估。