2013-06-21 72 views
0

我有一個SQL Server 2008的表具有以下結構和數據可選的邏輯或參數

INSERT INTO [ProductDetails]([ProductID],[ProductName],[Vendor],[Category]) 
VALUES(1,'Milk','V1','Food') 

INSERT INTO [ProductDetails]([ProductID],[ProductName],[Vendor],[Category]) 
VALUES(2,'Milk','V2','Food') 

INSERT INTO [ProductDetails]([ProductID],[ProductName],[Vendor],[Category]) 
VALUES(3,'Banana','V2','Food') 

我想申請邏輯或與下面的搜索我的搜索標準參數

DECLARE @ProductName VARCHAR(10) 
DECLARE @Vendor VARCHAR(10) 

下面列出了各種情況下的預期結果。

---CASE 1 
SET @ProductName = NULL 
SET @Vendor = NULL 
--Expected ProductID = 1,2,3 

---CASE 2 
SET @ProductName = 'Milk' 
SET @Vendor = 'V2' 
--Expected ProductID = 1,2,3 

---CASE 3 
SET @ProductName = NULL 
SET @Vendor = 'V2' 
--Expected ProductID = 2,3 

---CASE 3 
SET @ProductName = 'Banana' 
SET @Vendor = NULL 
--Expected ProductID = 3 

---CASE 5 
SET @ProductName = 'Banana' 
SET @Vendor = 'V2' 
--Expected ProductID = 2,3 

現在我能想到的唯一解決方案是運行單獨的查詢,如下所示。

  1. 如果同時@ProductName@VendorNULL,選擇所有產品

  2. IF @ProductName@Vendor非空,使兩個選擇查詢(查詢基於@ProductName值和查詢基礎上的聯合@Vendor值)

  3. IF @ProductNameNOT null@VendorNULL,選擇查詢結果BA sed的上@ProductName

  4. IF @ProductName爲null,並且@VendorNOT null,選擇查詢結果基於@Vendor值。

是否有更好的解決方案可以在一個查詢中完成,就像我們爲邏輯AND所做的那樣?

參考:

  1. Implementing search functionality with multiple optional parameters against database table

回答

3

比標準方法棘手。在這一點,你將兩者都定義爲當取交集:由OP

where (@ProductName = ProductName) or 
     (@Vendor = VendorName) or 
     (@ProductName is null and @Vendor is null) 

UPDATE

的理念是:

檢查是否any of the records in the table滿足線路的標準1

檢查any of the records in the table是否滿足第2行的標準

....

....

檢查所有的輸入是否爲空(ⅰ。即,搜索沒有任何輸入製造)

注意:如果所有的輸入參數爲NULL,表中的所有記錄將在結果中返回。

爲什麼?

因爲,表中的所有記錄都將符合此條件。 (數據不需要符合任何標準,沒有關於數據的比較 - 關於參數)。所以如果滿足最後一行括號內的條件,所有的記錄都很樂意出現在結果中。