繁体   English   中英

有条件地对sql查询应用过滤器

[英]Apply filter on sql query conditionally

可以说我在存储过程中有一个@Name参数。 我想这个参数来筛选, 只有当它不为空/空。 在其他情况下,我想忽略过滤器。

我提出了以下两种解决方案。 为了举例,让我们仅考虑参数为空的情况。

select *
  from MyTable
 where (len(rtrim(ltrim(@Name))) > 0 and Name = @Name) or (len(rtrim(ltrim(@Name))) = 0)

第二个

@query = 'select * from MyTable'
if (len(rtrim(ltrim(@Name))) > 0)
    @query = @query + ' Name = @Name '    

两种方法都按预期工作。

  • 您认为哪个最干净(就代码而言)且易于维护
  • 还有其他(更好)的选择吗?

注意:此问题也可能适用于Code Review,如果您认为这样,请发表评论,以便在那里进行迁移

可以这样简化

select *
  from MyTable
 where  Name = @Name or @Name = '' or @Name is null

或如注释中所述,使用NULLIF检查空字符串,然后将其替换为NULL然后针对IS NULL进行验证

where (Name = @Name or nullif(@Name, '') is null)

您不需要检查长度,默认情况下,SQL Server对尾随空格敏感(此规则的唯一例外是,当LIKE谓词表达式的右侧包含尾随空格时,则不删除填充)。

使用下面的代码。

DECLARE @Name='              '

IF(@Name='') SELECT 1 ELSE SELECT 0

如果在上面运行上述代码,您将得到1的结果。在您的情况下,可以删除LTRIM和RTRIM并仅针对空字符串文字测试是否相等。

select *
  from MyTable
  where ((@Name='' OR @Name IS NULL)OR(Name = @Name))

要么

IF(@Name='') SET @Name=NULL

select *
      from MyTable
      where (@Name IS NULL OR Name = @Name)

如果您正在存储过程中使用动态sql,请尝试执行以下操作。 最好对主选择查询和动态查询使用不同的变量,这些变量可以轻松扩展。 使用这种方法,当处理过程变得冗长时,将易于维护。

    declare @finalquery varchar(max)
    declare @mainSelectquery nvarchar(500);
    declare @whereCondtions varchar (1000);
    declare @DateParam datetime
    set @mainSelectquery=''
    set @whereCondtions =''

    set @finalquery =''

    set @DateParam=getdate()
    set @mainSelectquery = 'select * from tblOrders  where 1=1  '

    set @whereCondtions =  ' and Order_site =''TSN'''

    set @whereCondtions = @whereCondtions + ' AND CAST(ORDER_APPROVED_DATE_LT AS DATE)=CAST(GETDATE() AS DATE)' 

    set @finalquery =( @mainSelectquery + @whereCondtions)

    print @finalquery

 ---- You can further extend this by adding more where condition based on the parameter pass in stored proc 
 if (@OrderID !=0)
 begin 
 set @whereCondtions =  ' OrderID='+str ( @stateRefID )
 end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM