SQL Query的可选逻辑OR参数

时间:2013-06-21 14:49:54

标签: sql sql-server sql-server-2008

我有一个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')

我想在搜索条件中使用以下搜索参数

应用逻辑OR
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@Vendor均为NULL,请选择所有产品

  2. 如果@ProductName@Vendor非空,请将两个选择查询组合在一起(基于@ProductName值的查询和基于@Vendor值的查询)

  3. 如果@ProductNameNOT null@VendorNULL,请根据@ProductName值选择查询结果

  4. 如果@ProductName为空且@VendorNOT null,请根据@Vendor值选择查询结果。

  5. 是否有更好的解决方案可以在一个查询中完成,就像我们为逻辑AND做的那样?

    参考:

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

2 个答案:

答案 0 :(得分:3)

这比标准方法更棘手。在这种情况下,您将在定义两者时采用交叉点:

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

OP更新

这个想法是:

  

检查any of the records in the table是否满足第1行中的条件

     

检查any of the records in the table是否满足第2行的标准

     

...

     

...

     

检查所有输入是否为空(即,在没有任何输入的情况下进行搜索)

注意:如果所有输入参数都为NULL,则表中的所有记录都将返回到结果中。

为什么呢?

因为,表中的所有记录都符合此标准。 (数据不需要满足任何标准。没有数据比较 - 它是关于参数)。因此,如果满足最后一行括号内的条件,所有记录都很乐意出现在结果中。

答案 1 :(得分:0)

你可以这样做:

where (@ProductName IS NULL AND @Vendor IS NULL)
   OR (@ProductName IS NOT NULL AND ProductName=@ProductName)
   OR (@Vendor IS NOT NULL AND Vendor=@Vendor)