2013-06-21 4 views
0

У меня есть таблица SQL Server 2008 со следующей структурой и даннымиДополнительные логические ИЛИ параметры SQL Query

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. IF как @ProductName и @Vendor являются NULL, выберите все продукты

  2. IF @ProductName и @Vendor являются ненулевым, сделать объединение двух отдельных запросов (запросов на основе @ProductName стоимости и запроса на основе @Vendor значение)

  3. ЕСЛИ @ProductName является NOT null и @Vendor является NULL, выберите результат запроса ба СЭД на @ProductName значение

  4. IF @ProductName является недействительным и @Vendor является NOT null, выберите результат запроса на основе @Vendor значения.

Есть ли лучшее решение, которое можно выполнить в одном запросе, таком как тот, который мы делаем для логического И?

ССЫЛКА:

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

ответ

3

Это сложнее, чем стандартный метод. В том, что вы бы пересечение, когда обе определены:

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, все записи в таблице, будут возвращены в результате.

Почему?

Потому что все записи в таблице соответствуют этим критериям. (Данные не должны соответствовать никаким критериям. Сравнение данных не сравнивается - речь идет о параметрах). Поэтому, если условие в скобках последней строки встречается, все записи с удовольствием появляются в результате.