【问题标题】:Filter data based on dropdown values in webpage for SQL Server stored procedure根据 SQL Server 存储过程网页中的下拉值筛选数据
【发布时间】:2017-09-07 16:11:08
【问题描述】:

我想根据ProductCategoryProductSubCategoryYEAR 过滤Items 的数据。我有三个下拉菜单,分别是 ProductCategoryProductSubCategoryYEAR,根据用户选择,我想显示数据。

用户可以根据任何下拉选择过滤数据,并且 id 用户不选择任何内容,那么它应该默认显示所有记录。

我需要编写一个带有 3 个参数的存储过程才能正常工作,我被建议使用以下查询

SELECT *    
FROM Products
WHERE (CatID = 0 OR CatID IS NULL)
  AND (CatSubID = 0 OR CatSubID IS NULL)
  AND (DATEPART(YY, PubDate) = 0 OR DATEPART(YY, PubDate) IS NULL)

这个查询的问题是我没有 Null 值,如果它没有分配给任何类别或子类别并且年份部分永远不会为 NULL 或有 0,我在数据库中有 0,即使我将 0 更改为 null 如果不选择下拉列表中的任何值,它仍然不会获取任何内容

CatIDCatSubID 列中的0 表示它尚未分配到任何类别,因此我们可以说0 是这些产品的通用类别

Products数据:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
2   Title 2     2012-12-31      1           0       0
3   Title 3     2016-12-19      0           5       0
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5

示例 1:CatID = 7,CatSubID = 5,Year = 2016

结果:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
6   Title 6     2016-12-19      0           7       5

示例 2:CatID = 7,CatSubID = 0,Year = 0

结果:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5

示例 3:CatID = 0,CatSubID = 5,Year = 0

结果:

1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5

示例 4:CatID = 0,CatSubID = 0,Year = 0

结果:在这种情况下,它应该显示表的所有记录

【问题讨论】:

    标签: c# sql sql-server sql-server-2008 stored-procedures


    【解决方案1】:

    希望这会奏效,

    DECLARE @CatID    INT=0, 
            @CatSubID INT=0, 
            @YEAR     INT=0 
    
    SELECT * 
    FROM   #your_table 
    WHERE  ( catid = CASE 
                       WHEN @CatID = 0 THEN catid 
                       ELSE @CatID 
                     END ) 
           AND ( catsubid = CASE 
                              WHEN @CatSubID = 0 THEN catsubid 
                              ELSE @CatSubID 
                            END ) 
           AND ( Year(pubdate) = CASE 
                                   WHEN @YEAR = 0 THEN Year(pubdate) 
                                   ELSE @YEAR 
                                 END ) 
    

    【讨论】:

      【解决方案2】:

      考虑到您的上述查询,您可以使用简单的解决方案:

      CREATE TABLE [dbo].[MyTable](
          [ID] [int] NULL,
          [Title] [nvarchar](250) NULL,
          [PubDate] [datetime] NULL,
          [Visible] [bit] NULL,
          [CatID] [int] NULL,
          [CatSubID] [int] NULL
      ) ON [PRIMARY]
      
      GO
      

      如果上面的表结构是正确的,那为什么不使用下面的简化查询呢?

          create procedure Filter
              @CatID int
              ,@CatSubID int
              ,@Year int
          as
          begin
              select * from MyTable
              where CatID=@CatID and CatSubID=@CatSubID and year(PubDate)=@Year
          end
      

      【讨论】:

      • PubDate 真的应该是 DATEDATETIME2(n) 列 - 不要只是将所有内容存储为出于懒惰......另外:像 Year 这样的参数将最有可能更多的是一个数字值 - 所以你应该使用INT - 再次:不要只是把所有东西都写成varchar,因为这样你就不用去想了你的数据类型......你应该总是使用最合适的数据类型!
      • 立即查看!谢谢你的知识:)
      • 但是如果你的CatIdCatSubId表中的INT,那么你的参数Filter存储程序也应该是INT
      • 再次感谢拉。我真的很感谢你指导我:)
      【解决方案3】:

      我认为你想要这个 - 如果其中一个参数为零,则跳过该参数的 OR 子句的第二半 - 换句话说,你忽略它。

      CREATE PROCEDURE procProducts
      @catid INT,
      @catsubid INT,
      @year INT
      AS
      BEGIN
      
      SELECT  *    
      FROM Products
      WHERE (@CatID = 0 OR @CatID = CatID)
      AND (@CatSubID = 0 OR @CatSubID = CatSubID)
      AND (@year = 0 OR @year = DATEPART(YY,PubDate))
      
      END
      GO
      
      exec procProducts 0, 0, 0
      

      【讨论】:

      • 在此之前我已经尝试过,但没有得到正确的数据
      • 你确定?我很确定它有效...无论如何,输出都匹配您的所有示例案例。
      • 是的,我的错,它似乎有效,让我检查所有条件
      • 只想提一下您的查询作为查询工作,但是当我把它作为存储过程时,如果我将 0 值传递给年份,它就不起作用。虽然@PP006 给出的解决方案工作正常,但不确定您的查询为什么不起作用
      • @Learning 它绝对适用于存储过程。查看编辑 - 我将原始答案包装在 CREATE PROCEDURE 语句中。像魅力一样工作。
      猜你喜欢
      • 2020-10-23
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多