2011-09-22 59 views
1

我想在變量具有值的情況下執行WHERE子句的一部分。我曾嘗試以許多不同的方式寫這篇文章,但總是遇到錯誤,並想知道是否有人可以提供幫助。SQL:如果var =''不做任何其他的條件添加到WHERE子句

下面的代碼是我當前的SQL語句,但如果我的@itemId爲空,它將不會返回任何內容。如果將@itemId作爲值,我只想減少結果。

DECLARE @itemId nvarchar(max) 
SET @itemId = 'someId' 

SELECT 
SalesOrdersItems.Id, 
CASE 
    WHEN SalesOrderItems.ItemType = 'P' THEN Products.ProductId 
    WHEN SalesOrderItems.ItemType = 'S' THEN Sundries.SundryId 
    WHEN SalesOrderItems.ItemType = 'F' THEN FreightMethods.FreightMethodId 
    ELSE SalesOrderItems.FreeTextItem 
END AS ItemId 
FROM SalesOrderItems 
    LEFT OUTER JOIN Products ON SalesOrderItems.Product = Products.Product 
    LEFT OUTER JOIN Sundries ON SalesOrderItems.Sundry = Sundries.Sundry 
    LEFT OUTER JOIN FreightMethods ON SalesOrderItems.FreightMethod = FreightMethods.FreightMethod 
WHERE 
SalesOrdersItems.area LIKE 'SE%' 
AND (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 

我試過寫這樣的最後一行(見下面的代碼),但它不起作用。

AND CASE 
     WHEN @itemId = '' THEN 1 
     ELSE (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 
    END 

有沒有人有任何想法,我哪裏出錯了?

+0

是否有理由或不適合您的需求? AND(@itemID =''OR(...)) – billinkc

+0

不會解決問題,但考慮使用表格的別名,它可以幫助減少混亂 – Beef

回答

2

如果我誤解了請讓我知道,我假設如果你有一個空白的@itemID你想要所有的結果,否則你會限制結果。

WHERE SalesOrdersItems.area LIKE 'SE%' 
AND ((@itemId != '' 
    AND (Products.ProductId = @itemId 
     OR Sundries.SundryId = @itemId 
     OR FreightMethods.FreightMethodId = @itemId 
     OR SalesOrderItems.FreeTextItem = @itemId)) 
    OR @itemId = '') 

我相信我的父母是正確的,但他們可能會參差不齊。希望能夠明白我的意圖。

+0

+1這是我最初的方式。有些優化者甚至足夠聰明,能夠優化排除條件... –

+0

+1邪惡這工作非常感謝。 –

1
... 
WHERE 
1 = CASE WHEN ... THEN 1 ELSE 0 END 
... 
0

你很可能NULLIF()

AND CASE 
     WHEN NULLIF(@itemId, '') IS NULL THEN 1 
     ELSE (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 
    END 
0

按我的理解,你應該做類似下面。

 (Products.ProductId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (Sundries.SundryId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (FreightMethods.FreightMethodId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (FreightMethods.FreeTextItem = @itemId OR ISNULL(@itemId, '') = '') 

希望這有助於!

+0

這似乎是主機參數(我不熟悉)的SQL Server品牌。是否可以使用'OR @itemId IS NULL'來代替?只是好奇。另外,應該可以提取'@ itemId'子句,因此只需要檢查一次。 –