返回基于2个参数的查询结果

时间:2015-02-04 14:52:30

标签: sql sql-server tsql sql-server-2012

我有一个存储过程,它接受2个varchar类型的参数。默认值只是一个空字符串,但如果没有,则它是一个列表/数组,如下所示。

我试图提出一个查询,该查询将导致参数为空或实际包含某些内容。

如果参数为空,我在下面的内容中并未返回所有内容。

如果它们都是空的,那么我希望查询运行就像我刚刚这样做:

SELECT TOP(200) * FROM @ResultsTable

如果其中任何一个不为空,那么它需要针对列表运行,如:

SELECT TOP(200) * FROM @ResultsTable
WHERE engineGroup IN(5, 4, 9, 11)

--AND if the other one is not empty too:

AND modelYear IN(2007, 2009, 2015)

以下是查询:

    --PARAMETERS    
  @engineGroup AS VARCHAR(8000) = '',          --default to '' if null
  @modelYear AS VARCHAR(8000) = ''     --default to '' if null


 --@engineGroup is either '' or a grouping like (5, 4, 9, 11)
 --@modelYear is either '' or a group like (2005, 2012, 2015) 


SELECT  TOP(200) *
FROM    @ResultsTable
    WHERE
        @engineGroup = ''
    OR
        engineGroup IN(@engineGroup)
    AND 
        @modelYear = ''
    OR
        modelYear IN(@modelYear )

我确实得到了结果,但好像我没有正确的AND / OR逻辑。

它似乎是返回数据,就像我在两个参数之间执行OR语句而不是AND语句。

有没有更好的方法来构建它?

由于

1 个答案:

答案 0 :(得分:1)

使用它应该有效 - 但是使用多个IF语句应该会带来更好的性能(至少从我的经验来看)。 一个问题:

SELECT *
FROM @ResultTable
WHERE (engineGroup IN (@engineGroup) OR NULLIF(@engineGroup, '') IS NULL)
    AND (modelYear = @modelYear OR NULLIF(@modelYear, '') IS NULL)

多个IF:

IF @engineGroup IS NOT NULL AND @modelYear IS NOT NULL
BEGIN
    SELECT TOP (200) *
    FROM @ResultsTable
    WHERE engineGroup = @engineGroup
        AND modelYear = @modelYear
END
ELSE IF @engineGroup IS NOT NULL AND @modelYear IS NULL
BEGIN
    SELECT TOP (200) *
    FROM @ResultsTable
    WHERE engineGroup = @engineGroup
END
ELSE IF @engineGroup IS NULL AND @modelYear IS NOT NULL
BEGIN
    SELECT TOP (200) *
    FROM @ResultsTable
    WHERE modelYear = @modelYear
END
ELSE
BEGIN
    SELECT TOP (200) *
    FROM @ResultsTable
END