2013-12-10 54 views
0

我想過濾SELECT語句。我想要的行爲是,如果參數@ProductID =%,那麼我想在WHERE子句執行以下操作:WHERE語句基於變量值

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

如果@ProductID不=%我想以下WHERE子句:

WHERE (PDT.PK_Product = @productId) 

我無法實現此目的。

我已經嘗試過病例陳述,但無法讓它理解。我也嘗試過:

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

這是造成語法錯誤。我如何獲得理想的結果?

+2

LIKE opertator需要在左邊的字符數據類型。你的'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

沒錯,因爲你的productID參數是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