【问题标题】:Optional logical OR parameters for SQL QuerySQL 查询的可选逻辑 OR 参数
【发布时间】:2013-06-21 23:22:10
【问题描述】:

我有一个具有以下结构和数据的 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值选择查询结果。

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

参考:

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

【问题讨论】:

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


    【解决方案1】:

    这比标准方法更棘手。在那里,当两者都被定义时,你会选择交叉点:

    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,则结果中会返回表中的所有记录。

    为什么?

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多