我有一个存储过程,它接受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语句。
有没有更好的方法来构建它?
由于
答案 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