2013-12-10 44 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