SQL - 基于一个或多个参数但不是全部参数进行过滤

时间:2017-11-02 17:32:11

标签: sql sql-server tsql parameters

我正在尝试编写一个包含3个参数的查询脚本,但只能填充三者的任意组合,其中任何一个,其中任何两个或全部三个。

我试过的查询如下,你能告诉我我做错了吗?

DECLARE @Parameter1 NVARCHAR(255) =''
DECLARE @Parameter2 NVARCHAR(255) = ''
DECLARE @Parameter3 NVARCHAR(10) = ''

SELECT x.*  
from
(
SELECT 

list of columns for various tables

,case when len(@Parameter1) > 1 and apa.ACTION_DESCRIPTION like ('%' +@Parameter1 + '%' ) then 1 else 0 end [Parameter1]
,case when len(@Parameter2) > 1 and p.plan_name like ('%' + @Parameter2 + '%' ) then 1 else 0 end [Parameter2]
,case when len(@Parameter3) > 1 and r.res_code like ('%' + @Parameter3 + '%' ) then 1 else 0 end [Parameter3]

  FROM [LFB_Vision_GazAdmin].[dbo].[Gtablename] gap

  left outer join [dbo].[table2] as ap on ap.PLAN_ID=gap.PLAN_ID
  left outer join dbo.table3 p on p.plan_ID = p.PLAN_ID
  left outer join dbo.table4  as apa on ap.[ACTION_ID] = apa.ACTION_ID
  left outer join dbo.table5 R ON GAP.FCL_URN = R.FCL_URN
--  where 
--   (apa.ACTION_DESCRIPTION like ('%' + @Parameter1 + '%')
--OR p.PLAN_NAME like ('%' + @Parameter2 + '%')
--OR R.RESPONSECODE = @Parameter3 
--   )
) x 
where (
      (x.Parameter1=1 and (x.Parameter2=0 and x.Parameter3=0))
   or (x.Parameter2=1 and (x.Parameter1=0 and x.Parameter3=0))
   or (x.Parameter3=1 and (x.Parameter1=0 and x.Parameter2=0))
   or (x.Parameter3=0 and (x.Parameter1=1 and x.Parameter2=1))
   or (x.Parameter2=0 and (x.Parameter1=1 and x.Parameter3=1))
   or (x.Parameter1=0 and (x.Parameter2=1 and x.Parameter3=1))
   or (x.Parameter1=1 and x.Parameter2=1 and x.Parameter3=1)
      )

上面的查询有效,如果我只填充其中一个参数,但如果我填充两个或全部三个,那么它给了我更多的行,因为它给我的数据有两个第一个或第二个参数。如果填充了两个参数,我希望将两个参数考虑在内,如果填充了所有三个参数,则考虑所有三个参数。

如果有任何帮助,我将不胜感激。

先谢谢你。

1 个答案:

答案 0 :(得分:0)

我无法在没有实际数据的情况下执行实际测试 -

但我认为您可以采取以下措施来实现预期效果

您实际上并不需要CTECASE语句

DECLARE
    @param1 Nvarchar(10) = 'a', -- if Empty will not be considered as Filter
    @param2 Nvarchar(10) = 'f', -- if Empty will not be considered as Filter
    @param3 Nvarchar(10) = '' -- if Empty will not be considered as Filter

-- IF all @params are Empty, it will return all Rows


Select
    sReference,
    sDescription,
    sIMEI

From TelematicDevices td

Where 
    -- Will be TRUE if the @param1 = '' (means not filtered based on param1) 
    -- and will not search based on param1
    (td.sReference LIKE ('%' + @param1 + '%') OR @param1 = '')
    AND
    (td.sDescription LIKE ('%' + @param2 + '%') OR @param2 = '')
    AND
    (td.sIMEI LIKE ('%' + @param3 + '%') OR @param3 = '')

以下参数

DECLARE
    @param1 Nvarchar(10) = '', 
    @param2 Nvarchar(10) = 'hon', 
    @param3 Nvarchar(10) = '' 

我得到以下结果

enter image description here

如果我将Params改为

DECLARE
    @param1 Nvarchar(10) = '', 
    @param2 Nvarchar(10) = 'hon', 
    @param3 Nvarchar(10) = '83' 

我得到了

enter image description here