我是刚学习动态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子句。我无法找到方法
欢迎任何帮助,如果您不理解,请发表评论。谢谢!
答案 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在效率方面要好于与对象本身的比较。