我正在尝试编写一个包含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)
)
上面的查询有效,如果我只填充其中一个参数,但如果我填充两个或全部三个,那么它给了我更多的行,因为它给我的数据有两个第一个或第二个参数。如果填充了两个参数,我希望将两个参数考虑在内,如果填充了所有三个参数,则考虑所有三个参数。
如果有任何帮助,我将不胜感激。
先谢谢你。
答案 0 :(得分:0)
我无法在没有实际数据的情况下执行实际测试 -
但我认为您可以采取以下措施来实现预期效果
您实际上并不需要CTE
和CASE
语句
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) = ''
我得到以下结果
如果我将Params改为
DECLARE
@param1 Nvarchar(10) = '',
@param2 Nvarchar(10) = 'hon',
@param3 Nvarchar(10) = '83'
我得到了