2013-12-10 38 views
-1

我想根據變量是否是數字來過濾SELECT語句。我想要的行爲是,如果該參數@ProductID不是一個號碼,然後我想在WHERE子句執行以下操作:根據變量是否是數字來過濾WHERE

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

如果@ProductID是一個數字我想以下WHERE子句:

WHERE (PDT.PK_Product = @productId) 

我想下面將工作:

WHERE (ISNUMERIC(@productId) = 0 AND DTH.TaskId IS NULL 
      OR PDT.PK_Product LIKE @productId) 
    AND (ISNUMERIC(@productId) = 1 AND PDT.PK_Product = @productId) 

,因爲如果ISNUMERIC(@ProductID)的計算結果爲0,它不會使用聲明的第二部分,如果1第一。

編輯:

我的問題是,如果ProductID等於數字(和ISNUMERIC(@ProductID)計算結果爲1)我仍然得到結果,其中DTH.TaskId IS NULL。

+1

「不工作,但是」是什麼意思? –

+0

我在上面添加了一個響應。感謝您幫助我澄清。 –

+0

如果您的SELECT使用聚合函數,那麼這可能很重要:在存在聚合函數的情況下,CASE不能可靠地提供短路評估。請參閱[CASE/COALESCE不總是按照文本順序 ](https://connect.microsoft.com/SQLServer/feedback/details/690017/case-coalesce-wont-always-evaluate-in-textual-order)進行評估和[聚合不遵循CASE ](https://connect.microsoft.com/SQLServer/feedback/details/691535/aggregates-dont-follow-the-semantics-of-case)的語義。 – HABO

回答

1
WHERE 1 = 
    CASE ISNUMERIC(@productId) 
    WHEN 0 THEN 
     CASE WHEN DTH.TaskId IS NULL OR PDT.PK_Product LIKE @productId THEN 1 END 
    WHEN 1 THEN 
     CASE WHEN DTH.TaskId IS NOT NULL AND PDT.PK_Product = @productId THEN 1 END 
    END 
1

你接近,這應該做的伎倆

WHERE (ISNUMERIC(@productId) = 1 AND PDT.PK_Product = @productId AND DTH.TaskId IS NOT NULL) OR 
     (ISNUMERIC(@productId) = 0 AND (DTH.TaskId IS NULL OR PDT.PK_Product LIKE @productId)) 
+0

我仍然得到相同的結果,其中@productId是一個數字,我要回DTH.TaskId爲NULL的行 –

+0

@DavidTunnell上面的查詢明確排除了「DTH.TaskId爲NULL」的情況,如果您有一些樣本數據,我可以看看它是什麼確切的問題,但上面的查詢應該工作,請注意這在第一組的末尾where子句中,AND DTH.TaskId不是NULL' – Jason

1

看起來像你需要另一組括號,並更改爲OR

WHERE (ISNUMERIC(@productId) = 0 AND (DTH.TaskId IS NULL 
     OR PDT.PK_Product LIKE @productId)) 
OR (ISNUMERIC(@productId) = 1 AND PDT.PK_Product = @productId AND DTH.TaskId IS NOT NULL) 
+0

我仍然得到相同的結果當@productId是一個數字時,我要回DTH.TaskId爲NULL的行 –

+0

編輯將NOT NULL添加到WHERE的第二部分。 – SteveB

2

你需要周圍多餘的括號OR有條件,因爲AND優先。您不能在條件組之間使用AND,因爲@productId只能是數字或不是兩個數字。您還需要從第二個條件中篩選出NOT NULL值。因此:

WHERE 
(
    ISNUMERIC(@productId) = 0 AND 
    (
    DTH.TaskId IS NULL 
    OR PDT.PK_Product LIKE @productId 
) -- <-- these parens are important 
) 
OR -- <-- this can't be AND - @productId can't be numeric and not numeric 
(
    ISNUMERIC(@productId) = 1 
    AND DTH.TaskID IS NOT NULL -- <-- this clause is important according to edit 
    AND PDT.PK_Product = @productId 
); 
相關問題