在where

时间:2015-10-16 15:17:41

标签: sql-server sql-server-2008

我是刚学习动态sql的新手,但我需要一个动态查询。我从谷歌那里学到了什么,以及如何构建一个,但我坚持一些事情,这可能是一个非常简单的事情,因为我是一个新的。我正在进行查询,其中使用了where子句。我的问题是可能有过滤器或没有任何过滤器。

我可以在where子句中有条件,有时可以为null,或者那些条件会有一些值。

我已经编写了一个小代码但是如果filter中的值为0,则无法获取,即该特定列没有过滤器,所以我要写什么,因为会有更多的过滤器,它们之间会有AND那么如何构建该查询

我的代码是 -

alter procedure db.test_1(@param1 varchar(10),@param2 varchar(10),@param3 varchar(10),@param4 varchar(10)@param5 varchar(10))
as
begin
declare @id varchar(250)
declare @type varchar(250) 
declare @xyz varchar(250)
declare @name varchar(250)
declare @abc varchar(250)
declare @sql varchar(800)
set @id= case when convert(varchar,@param1)='0' then ''
                      when @param1 like '%%' then 'carrier_id in ('+convert(varchar,@param)+')'
                      else 'id='+@param1 end ;
set @type= case when convert(varchar,@param2)='0' then ''
                      else '@type='+@param2 end ;

set @xyz= case when convert(varchar,@param3)='0' then ''
                      else '@xyz='+@param3 end ;

set @name= case when convert(varchar,@param4)='0' then ''
                      else '@name='+@param4 end ;

set @abc= case when convert(varchar,@param5)='0' then ''
                      else '@abc='+@param5 end ;

set @sql='select sum(column_1) from db.test_1 where '+@id+'and'+@type+'and'+@xyz+'and'+@name+'and'+ @abc

select @sql; -- to know what query is running
--execute(@sql)
end

现在对于查询,如果我们对一个参数有0,那么它将为null但是在该查询中将有一个额外的结束我将如何做到这一点。这也是我原始查询中的示例查询我有四个连接然后这个where子句。我无法找到方法

欢迎任何帮助,如果您不理解,请发表评论。谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个非常常用的技巧。

关键元素是使用“1 = 1”作为占位符,并在过滤字符串中包含“AND”。

alter procedure db.test_1(@param1 varchar(10),@param2 varchar(10),@param3 varchar(10),@param4 varchar(10)@param5 varchar(10))
as
begin
declare @id varchar(250)
declare @type varchar(250) 
declare @xyz varchar(250)
declare @name varchar(250)
declare @abc varchar(250)
declare @sql varchar(800)
set @id= case when convert(varchar,@param1)='0' then ''
                      when @param1 like '%%' then ' and carrier_id in ('+convert(varchar,@param)+')'
                      else ' and id='+@param1 end ;
set @type= case when convert(varchar,@param2)='0' then ''
                      else ' and type='+@param2 end ;

set @xyz= case when convert(varchar,@param3)='0' then ''
                      else ' and xyz='+@param3 end ;

set @name= case when convert(varchar,@param4)='0' then ''
                      else ' and name='+@param4 end ;

set @abc= case when convert(varchar,@param5)='0' then ''
                      else ' and abc='+@param5 end ;

set @sql='select sum(column_1) from db.test_1 where 1=1'+@id+@type+@xyz+@name+ @abc

select @sql; -- to know what query is running
--execute(@sql)
end

答案 1 :(得分:0)

而不是''当没有过滤器使用与字段本身的比较时,即

set @id= case when convert(varchar,@param1)='0' then 'id=id'
                  when @param1 like '%%' then 'carrier_id in ('+convert(varchar,@param)+')'
                  else 'id='+@param1 end ;

这样它将永远是真的,不会破坏查询的其余部分。这样效率非常低,所以你可以尝试的另一件事是一个变量,它可以跟踪任何过滤器是否已经是0但是在这种情况下添加'和'到变量文本而不是固定在最后。

编辑:这里的另一个答案中建议的1 = 1在效率方面要好于与对象本身的比较。