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