【问题标题】:If-Else in T-SQL where clauseT-SQL where 子句中的 If-Else
【发布时间】:2013-09-08 23:52:27
【问题描述】:

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

谢谢

【问题讨论】:

  • 请务必了解 Col_n LIKE '%' + @Criteria1 + '%' 最多执行索引扫描,最坏执行表扫描,因为 like 模式中的前导通配符。如果您的数据表大小不一,您将希望尽快重新考虑这种设计。
  • 谢谢彼得。我将放弃领先的 %。

标签: tsql stored-procedures


【解决方案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';

【讨论】:

  • 你是对的。但它不仅仅是 AND/OR,它也是 '=' 而不是 '!='。
【解决方案2】:

您可以使用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)。

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多