如何使用多个"%"来搜索SQL数据库?通配符?

时间:2016-01-25 16:09:13

标签: sql sql-server-2008-r2

我试图在SQL Server 2008 R2中编写一个SQL查询,允许用户通过许多参数搜索数据库表。这应该是这样的,我的用户输入他的标准,查询查找所有的匹配,同时忽略用户没有输入值的那些标准。

我使用LIKE和参数编写了我的查询,如下所示:

select item 
from [item] 
where a like @a and b like @b and c like @c ...

其中' a',' b'和' c'是表格列,我的@参数都默认为' %'通配符。这持续了大约20个不同的列,这导致我的问题:如果按原样输入此查询,没有输入,只是通配符,它​​不返回任何结果。然而,此表包含超过30,000行,因此全通配符查询应返回整个表。显然,我是以错误的方式解决这个问题,但我不知道如何纠正它。

我无法使用' contains'或者' freetext',因为它们会查找整个单词,我需要匹配用户输入,无论它在实际列值中出现的位置。我尝试使用“交叉”将查询分解为单个步骤,但这并没有改变任何内容。有谁知道更好的方法吗?

4 个答案:

答案 0 :(得分:0)

要允许空输入,这是一个很好的模式:

select * from my table where ColA LIKE isnull(@a, ColA) AND ColB like isnull(@b, ColB)

这避免了必须构造和执行动态SQL语句(以及创建可能的SQL注入问题。)

答案 1 :(得分:0)

  

我的@参数全部默认为'%'通配符

不要这样做。将它们默认为null。忽略空参数的方法是短路:

(@a IS NULL OR @a LIKE a)

根据您希望如何处理列中缺少的数据,您可能需要第三个术语,因为null与LIKE语句不匹配:

(@a IS NULL OR a IS NULL OR @a LIKE a)
  

如何使用多个"%"来搜索SQL数据库?通配符?

慢慢。 SQL在进行文本比较时不是最理想的。最好的方法是在其他地方执行此搜索,或至少构建数据以方便这些类型的查询。如果您知道自己将执行大量这些查询,请考虑以suffix tree的形式重新设计架构。在绝对最低限度,做一些事情,以便每个LIKE匹配仅后缀,意味着LIKE' xxx%'并且从不喜欢'%xxx'或者喜欢&x 39; x%x'。后两者排除了索引的使用。并在您需要搜索的每一列上添加索引。

答案 2 :(得分:0)

感谢所有人的指导。事实证明,我正在查询的表可以很容易地在我正在搜索的列中包含空值,所以我扩展了我的查询以说“where(像@a或a是null)和...”和它现在有效。

答案 3 :(得分:-1)

就个人而言,我会在应用程序层(假设你有一个)中执行此操作,并围绕用户提供的参数构建查询,从而消除他们不提供的参数。

例如,以下代码在SQL中构建查询,其中只有用户提供的参数(不是null)包含在where子句中。

注意:这是非常粗略,因为如果第一个参数为null,它没有考虑AND,并且它没有'如果没有提供参数,请删除WHERE子句。如果您让我知道您的应用程序层所使用的语言,我将提供一个更好的示例。 (这是纯粹的伪代码!)

DECLARE @a VARCHAR(100) = '''%SomeValue%''', @b VARCHAR(100)= '''%AnotherValue%''', @c VARCHAR(100)

DECLARE @SQL VARCHAR(MAX) = 'SELECT * FROM MyTable WHERE'

IF @a IS NOT NULL
BEGIN
    SET @SQL += ' ColA LIKE ' + @a
END

IF @b IS NOT NULL
BEGIN
    SET @SQL += ' AND ColA LIKE ' + @b
END

IF @c IS NOT NULL
BEGIN
    SET @SQL += ' AND ColC LIKE ' + @c
END

PRINT @SQL

--EXEC(@SQL)

<强>输出:

SELECT * FROM MyTable WHERE ColA = '%SomeValue%' AND ColB = '%AnotherValue%'