1

抱歉,如果以前有人问过这个问题。我已经搜索了这个网站,但没有找到答案。

我有一张桌子大约。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

现在我必须创建一个应用程序,允许用户使用下拉列表的组合过滤这些属性中的任何一个。这些列表包含其他表的值,以及一个额外的值:“全部”。

如何构造我的查询,使其接受这 15 个字段作为参数,值要么是真实值,要么是“-1”表示“全部”,然后过滤适当的记录?

4

2 回答 2

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
于 2013-05-27T12:13:01.750 回答
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)
    ...
    ..
    .;
于 2013-05-27T12:24:41.563 回答