Return 根据2个参数查询结果

Return query results based on 2 parameters

我有一个存储过程接受 2 个 varchar 类型的参数。默认值只是一个空字符串,但如果不是,则它是下面定义的 list/array 个数字。

我正在尝试提出一个查询,该查询将说明参数为空或实际上包含某些内容。

我在下面看到的是,如果参数为空,则不会返回所有内容。

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

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 语句。

是否有更好的结构方式?

谢谢

使用它应该可行——但是使用多个 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