我想根据Items
,ProductCategory
和ProductSubCategory
过滤YEAR
的数据。我有三个下拉列表ProductCategory
,ProductSubCategory
和YEAR
,根据用户选择我想显示数据。
用户可以根据任何下拉选项过滤数据,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
结果:在这种情况下,它应该显示表的所有记录
答案 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