2013-12-10 2 views
0

SELECT 문을 필터링하려고합니다.변수 값을 기반으로하는 WHERE 문

WHERE (DTH.TaskId IS NULL OR PDT.PK_Product LIKE @productId) 

@productId 내가하지 = % 원하는 경우 다음 WHERE 절 :

WHERE (PDT.PK_Product = @productId) 
내가 원하는 동작은 매개 변수 @productId = % 다음 내가 원하는 경우 WHERE 절은 다음과 같은 작업을 수행 할 것입니다

문제를 해결하는 데 문제가 있습니다.

나는 case 문을 시도했지만 이해할 수 없었다. 나는 또한 시도했다 :

WHERE IF @productId = '%' (
     DTH.TaskId IS NULL 
     OR PDT.PK_Product LIKE @productId 
     ) ELSE (
     PDT.PK_Product = @productId 
     ) 

이것은 구문 오류의 원인입니다. 원하는 결과를 얻으려면 어떻게해야합니까? opertator LIKE

+2

왼쪽에 문자 데이터 유형을 필요로한다. 'PDT.PK_Product'는 문자 데이터 유형이 아닙니다. 'PDT.PK_Product LIKE @ productId'로 무엇을 성취하려고합니까? 즉, 어떤 결과를 기대합니까? –

+0

당신이하려는 일을 단어로 알려주십시오 ... –

답변

6
WHERE 
    (@productId = '%' AND (DTH.TaskId IS NULL OR PDT.PK_Product LIKE @productId)) 
    OR 
    (NOT @productId = '%' AND (PDT.PK_Product = @productId)) 
+0

어디에서 왔는지 알고 있습니다. 이것은 의미가 있습니다. 그러나 오류가 나타납니다. varchar 값 '%'을 데이터 형식 int로 변환 할 때 변환이 실패했습니다. –

+0

제품 ID가 param이므로 INT로 지정하십시오. INT를 사용해야하지만 '%'대신 NULL 값을 사용해야 할 수도 있습니다. –

+0

INT를 그대로두면 첫 번째 명령문에서 LIKE를 사용할 수 없습니다. –

0
--assumes -1 and 0 are invalid TaskIds 
WHERE PDT.PK_Product LIKE @productId 
    OR coalesce(DTH.TaskId, -1) = case when @productId = '%' THEN -1 ELSE coalesce(DTH.TaskID,0) END 
0
SELECT.. 
FROM.. 
WHERE @productId = '%' AND (DTH.TaskId IS NULL OR PDT.PK_Product LIKE @productId) 

UNION 

SELECT... 
FROM... 
WHERE @productId != '%' AND PDT.PK_Product = @productId