SQL查询通配符搜索

6

我正在编写一个与listview相关联的C#网页。我的客户希望能够输入某些内容或部分内容,然后显示结果。例如,他想要一个文本框,在其中可以输入电话号码、电话号码的一部分、姓名、城市或其他任何信息,并且有一种存储过程可以查找并列出这些信息。我该如何在SQL SP或VS 2010中实现这一点?


尝试从同样的“SQL查询通配符搜索”中搜索stackoverflow...有很多类似的问题得到了解答。 - Saif Khan
5个回答

7

SELECT cols FROM tbl WHERE field LIKE '%' + @input + '%'

的意思是从表tbl中选择cols列,其中field列包含@input的任何值。%


4
零!+1 是因为它有效。-1 是因为你鼓励一个明显新手的 SQL Server 编程人员编写容易受到 SQL 注入攻击的代码。 - Rob Levine
抱歉,被识破了。 "input" 应该是你存储过程的参数,而不是应用程序中的变量。需要进行编辑以显示这一点。 - joelt
@Rob Levine:那么你如何在其中注入SQL呢?这不是一个动态查询。我错过了什么吗? - Andriy M
@Andriy M - 已经进行了编辑。最初它是一个动态查询(或者至少可以是)。joelt已经编辑过它,加入了@符号以显示这现在是一个参数化查询。您可以通过单击问题下方“编辑”旁边的链接查看以前的编辑 - 但您可能已经知道了! - Rob Levine
@Rob,从语法上来看,原始答案只是缺少了@符号,从来没有任何暗示它应该是动态SQL。否则,它不符合任何字符串连接的语言规范。 - RichardTheKiwi
@Richard,也就是cyberkiwi - 抱歉,我不同意您的观点。虽然编写者可能没有想要使用动态SQL,但是以那种形式书写确实看起来像是“获取SQL字符串并连接用户输入”。特别是当回答初学某项技术(如SQL)的人们的问题时,始终保持清晰明了非常重要。原贴作者容易读到这个答案并按照它所建议的方法使用动态SQL。Joelt接受了这个批评,改进了他的回答使其更加明确,现在获得了提升-这是应该的。 - Rob Levine

3

正如其他人所建议的那样,使用LIKE运算符。

然而,不要像其他人建议的那样,直接将用户输入的数据放入您的LIKE子句中。这会导致一种非常简单且非常危险的漏洞,称为SQL注入攻击。

如果您直接插入用户的输入,则可能会使您的应用程序受到SQL注入攻击的影响。

SELECT cols FROM tbl WHERE field LIKE '%' + input + '%'

如果用户在文本框中输入以下内容:

;DROP TABLE tbl; --

(作为示例),这将使您的SQL语句变成:

SELECT cols FROM tbl WHERE field LIKE '%';  (the first part of your query)
DROP TABLE tbl;    (the injected sql that you don't want to let people run; drop the database table)
-- '%'   (the rest of your previous query is commented out)

始终确保使用参数化的SQL语句,或者至少对输入进行消毒处理。您真的不希望其他人能够在您的数据库服务器上运行任意SQL。

Jeff Atwood(SO的知名人物)在这方面有一篇简短的文章。这也值得阅读这里 :)


1
大多数人已经找到了问题的一部分解决方案——使用LIKE运算符。
但我认为可以在SQL中解决问题的另一个方面。
创建一个计算的varchar(MAX)列。 在此字段上启用全文索引。 然后,您只需要执行类似于SQL的操作即可:
SELECT * from <TABLE_NAME> WHERE Keywords like '%<search term>%'

这样你就不必像这样做 phone like <search> 或者 name like <search> 等等。


0
使用LIKE运算符。
SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
City LIKE '%value%'

0
如果您想使用一个文本框来包含多种不同类型的数据,您需要在代码中明确指定要搜索哪些数据库表和列,以及搜索的顺序。
例如,您可以编写一个查询来执行以下操作:
  • 首先,在客户表中的“名字”和“姓氏”列中搜索与文本框中相似的名称。选择所有匹配项的客户ID。
  • 接下来,在客户表和供应商表中的“电话号码”列中搜索与文本框中相似的电话号码。选择所有匹配项的客户ID或供应商ID。如果找到任何结果,请将它们与第一个查询的结果合并。
  • 继续搜索街道地址,并查询其他表。
  • 随着查询的进行,将新记录添加到结果集中。
  • 在查询所有想要搜索的表之后,您将获得一个包含ID的结果集。您需要执行另一系列SELECT语句来获取要显示给用户的信息。如果混合使用客户和供应商(以及员工等),这可能会变得非常复杂。

从这个例子中可以看出,为每个搜索条件单独设置文本框会更容易。一个用于名字,另一个用于姓氏,第三个用于公司名称。电话号码则需要单独的文本框。如果您要混合搜索客户、供应商、员工等数据,您应该让用户指示(可能是下拉列表或复选框),以便您知道查询哪些表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接