2017-11-02 1 views
0

매개 변수가 3 개이지만 3 개 중 하나만 조합하거나 두 개 중 하나만 채우거나 둘 중 하나만 채울 수있는 쿼리를 스크립팅하려고합니다. 세 개 모두.SQL - 하나 이상의 매개 변수를 기반으로 모든 매개 변수가 아닌 필터를 기반으로합니다.

내가 시도한 쿼리는 다음과 같습니다. 내가 잘못하고있는 것을 조언 해 주실 수 있습니까? 난 단지 매개 변수 중 하나를 채울 경우

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 ('%' [email protected] + '%') 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

* 당신이 내가 뭘 잘못 알려 주시기 바랍니다 수 있습니다 얻을 ? * ... 우선, 무엇이 잘못되었는지 알려주십시오 - 오류? 바람직하지 않은 결과? – Parfait

+0

@ Parfait, 매개 변수 중 하나만 채우면 작동하지만 두 개 또는 세 개 모두 채우면 나에게 두 번째 또는 두 번째 매개 변수와 관련된 데이터를 제공하여 더 많은 행을 제공합니다. 두 개가 채워지면 두 매개 변수를 모두 고려하고 세 개 모두 채워지면 세 개를 모두 고려해야합니다. – msinghm

+0

당신은 그 논리를 전혀 시도하지 않았습니까? 그것들은'WHERE' 절이 무엇인가, 아니면 @Parameter #와 관계가없는 조항입니까? 특히 두 집합이 모두 다른 유형입니까? – Parfait

답변

0

나는 실제 데이터없이 실제 시험을 수행 할 수 없습니다 -

을하지만 난 당신처럼 뭔가를 할 수 있다고 생각 당신이 실제로 CTE과 필요하지 않은 예상 된 결과를

을 달성하기 위해 다음과 같은 CASE 문 다음 PARAMS와

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) = '' 
,536,913 63,210

나는 다음과 같은 결과를

enter image description here

를 얻을 내가

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

에에 Params를 변경하면 내가

enter image description here

+0

대단히 감사합니다. 그것은 완벽하게 작동했습니다. where 절은 내가 필요한 것입니다. 나는 이것을 지나치게 복잡하게 만들고 있었다. – msinghm

관련 문제