如果之前已经提出这个问题,请道歉。我搜索过这个网站,但没有找到答案。
我有一张大约一张桌子。 15个领域。其中大多数是其他表(属性)的外键,如下所示:
Table MyObject
name nvarchar(500)
property_1_id int
property_2_id int
.....
property_15_id int
Table Property_1
id int
name nvarchar(50)
Table Property_2
id int
name nvarchar(50)
.. etc
现在我必须创建一个应用程序,允许用户使用下拉列表的组合过滤这些属性中的任何一个。这些列表包含其他表的值,以及一个额外的值:'All'。
如何构造我的查询,使其接受这15个字段作为参数,值为实数值,或“-1”表示“全部”,然后过滤相应的记录?
答案 0 :(得分:1)
像这样:
SELECT Property_1, Property_2 FROM MyObject
WHERE (Property_1 = @Property_1 OR @Property_1 = -1)
AND (Property_2 = @Property_2 OR @Property_2 = -1)
为每个属性添加更多AND
语句
每当参数设置为-1
时,相应的AND
子句将始终求值为true,从而返回该属性的任何值。
带有5个参数的示例T-SQL脚本如下所示:
CREATE PROCEDURE [dbo].[EnterYourSprocNameHere]
@property_1 INT = -1
,@property_2 INT = -1
,@property_3 INT = -1
,@property_4 INT = -1
,@property_5 INT = -1
AS
BEGIN
SELECT property_1, property_2, property_3, property_4, property_5
FROM MyObject
WHERE (Property_1 = @property_1 OR @property_1 = -1)
AND (Property_2 = @property_2 OR @property_2 = -1)
AND (Property_3 = @property_3 OR @property_3 = -1)
AND (Property_4 = @property_4 OR @property_4 = -1)
AND (Property_5 = @property_5 OR @property_5 = -1)
END
如果要传递null而不是-1,请使用以下脚本:
CREATE PROCEDURE [dbo].[EnterYourSprocNameHere]
@property_1 INT = NULL
,@property_2 INT = NULL
,@property_3 INT = NULL
,@property_4 INT = NULL
,@property_5 INT = NULL
AS
BEGIN
SELECT property_1, property_2, property_3, property_4, property_5
FROM MyObject
WHERE (Property_1 = @property_1 OR @property_1 IS NULL)
AND (Property_2 = @property_2 OR @property_2 IS NULL)
AND (Property_3 = @property_3 OR @property_3 IS NULL)
AND (Property_4 = @property_4 OR @property_4 IS NULL)
AND (Property_5 = @property_5 OR @property_5 IS NULL)
END
答案 1 :(得分:0)
如果可以发送NULL值而不是-1,则可以使用ISNULL函数。
SELECT Property_1, Property_2, Property_3
FROM MyObject
WHERE Property_1 = ISNULL(@Property_1, Property_1)
AND Property_2 = ISNULL(@Property_2, Property_2)
AND Property_3 = ISNULL(@Property_3, Property_3)
...
..
.;