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
我有一个存储过程接受 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