根据SQL Server存储过程的网页中的下拉值过滤数据

时间:2017-04-12 04:00:14

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

我想根据ItemsProductCategoryProductSubCategory过滤YEAR的数据。我有三个下拉列表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值,如果未分配给任何类别或子类别,则数据库中的数字为0,年份部分永远不为NULL或者0即使我将0更改为null,如果不选择任何下拉值,它仍然无法获取任何内容

0中的

CatID& CatSubID列表示尚未分配给任何类别,因此我们可以说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,年= 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,年= 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,年= 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,年= 0

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

3 个答案:

答案 0 :(得分:2)

希望这会奏效,

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 ) 

答案 1 :(得分:0)

我想你想要这个 - 如果其中一个参数为零,你跳过该参数的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

答案 2 :(得分:0)

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

function share_to_facebook(url){

    $.ajax({
    type: "POST",
    url: "/create_data",
    data: data,
    success: function(result) {
      if(result.success=="success"){
        // url contains the facebook url with some required parameters.
        window.open(url, '_blank');
     }
    }
  });
}

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

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