SQL:构建一个过滤器 - 这可以在没有动态sql的情况下完成吗?

时间:2011-03-03 13:03:23

标签: sql sql-server-2005 filter dynamic-sql

这是我在列表中一直看到的内容。 必须为2列做一个过滤器(我用了一个较短的例子,我们有50列的列表,看起来一样......)

我想知道是否有办法以不同的方式做到这一点。 你们用什么来过滤表中的记录?

    /* parameters */
@CostNumber = ...
@Description = ...
    /* parameters */

SET @strSQL = '
SELECT  [CostLevelId], [CostNumber], [Description]
FROM    [CostLevel]
WHERE   1 = 1 ' /* this looks weird, but we'll add the "WHERE" stuff easier */

IF (@CostNumber IS NOT NULL)
BEGIN
    SET @strSQL = @strSQL + ' AND [CostNumber] LIKE ''%' + REPLACE(@CostNumber,'''','''''') + '%'' '
END

IF (@Description IS NOT NULL)
BEGIN
    SET @strSQL = @strSQL + ' AND [Description] LIKE ''%' + REPLACE(@Description,'''','''''') + '%'' '
END

EXEC (@strSQL)

4 个答案:

答案 0 :(得分:1)

为什么不废弃动态SQL方法?

    /* parameters */
@CostNumber = ...
@Description = ...
    /* parameters */

SELECT  [CostLevelId], [CostNumber], [Description]
FROM    [CostLevel]
WHERE   [CostNumber] LIKE '%' + @CostNumber + '%'
AND [Description] LIKE '%' + @Description + '%'

要注意的事项 - null@CostNumber参数中的@Description - 您必须确保将它们转换为空字符串。

您需要考虑的另一件事是@Description might包含%个字符的事实,您必须逃避LIKE才能正常工作。

答案 1 :(得分:0)

我不知道在涉及LIKE运算符时如何执行此操作,使用比较运算符时我使用默认值来获取如下内容:

select *
from dbo.SomeTable a
where
(a.IntColumn = @IntColumnValue or @IntColumnValue = -1)
and (a.VarCharColumn = @VarCharValue or @VarCharValue = 'zzz')

这样,如果我不想应用特定的过滤器,我只需将其设置为默认值(在此示例中为-1zzz),因此其检查始终为yelds true。 / p>

使用LIKE运算符应该是类似的,也许您应该将默认值设置为您知道在数据中永远不会找到的某种字符串?像这样的东西?

where (a.VarCharColumn like '%' + @VarCharValue + '%' or @VarCharValue = '§§§TheDefaultValue§§§')

答案 2 :(得分:0)

我没有办法测试这个atm,但是怎么样

SELECT  [CostLevelId], [CostNumber], [Description]
FROM [CostLevel]
WHERE (@CostNumber IS NOT NULL AND [CostNumber] LIKE ''%' + REPLACE(@CostNumber,'''','''''') + '%'')
OR
(@Description IS NOT NULL AND [Description] LIKE ''%' + REPLACE(@Description,'''','''''') + '%'')
GROUP BY [CostLevelId], [CostNumber], [Description]

如果不这样做,你可以尝试UNION而不是OR(和分组)。

答案 3 :(得分:0)

您可以测试查询中的值是否为null,再加上您的条件和一个或者语句,这允许可选参数。

这适用于类似的声明。

SELECT  [CostLevelId], [CostNumber], [Description]
FROM    [CostLevel]
WHERE   
    (@CostNumber is null or [CostNumber] LIKE '%'+@CostNumber+'%')
    and
    (@Description is null or [Description] LIKE '%'+@Description+'%')

如果是直接相等比较,则可以使用coalesce与填充变量进行比较,或者当变量为null时自身。

SELECT  [CostLevelId], [CostNumber], [Description]
FROM    [CostLevel]
WHERE   
    [CostNumber] = coalesce(@CostNumber,[CostNumber])
    and
    [Description] = coalesce(@Description,[CostNumber])

请记住,这可能会对您的查询计划产生负面影响,具体取决于设置的变量,表格填充和数据库结构等。您甚至可能会发现动态SQL方法的执行效率高于此,尽管其中包含额外的复杂性它的结构。