SQL筛选多个列,可能具有“全部”值

时间:2013-05-27 12:09:42

标签: sql-server

如果之前已经提出这个问题,请道歉。我搜索过这个网站,但没有找到答案。

我有一张大约一张桌子。 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”表示“全部”,然后过滤相应的记录?

2 个答案:

答案 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)
    ...
    ..
    .;