【问题标题】:SQL - Filter based on one or more parameters but not all of themSQL - 基于一个或多个参数但不是所有参数进行过滤
【发布时间】:2017-11-02 17:32:10
【问题描述】:

我正在尝试编写一个具有 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)
      )

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

如果能提供任何帮助,我将不胜感激。

先谢谢你了。

【问题讨论】:

  • 你能告诉我我做错了什么吗? ...首先,告诉我们什么是错误的?不想要的结果?
  • @Parfait ,如果我只填充一个参数,它会起作用,但如果我填充两个或全部三个参数,那么它会给我更多的行,因为它给我的数据与第一个或第二个参数有关。如果填充了两个参数,我希望它考虑这两个参数,如果填充了所有三个参数,则考虑所有三个参数。
  • 你有没有尝试过这个逻辑?这是WHERE 子句的用途还是这些子句与@Parameter# 无关,尤其是因为这两个集合是不同的类型?

标签: sql sql-server tsql parameters


【解决方案1】:

没有实际数据我无法进行实际测试 -

但我认为您可以执行以下操作以达到预期结果

您实际上并不需要 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) = '' 

我得到以下结果

如果我将参数更改为

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

我明白了

【讨论】:

  • 非常感谢。那工作得很好。 where 子句正是我所需要的。我过于复杂了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2019-10-28
  • 2021-06-08
相关资源
最近更新 更多