繁体   English   中英

SQL查询通配符搜索

[英]SQL Query wildcard search

我正在写一个与列表视图绑定的C#网页。 我的客户希望能够输入可显示结果的某些内容或部分内容。 例如,他想要一个文本框,他可以在其中输入电话号码,电话号码的一部分,姓名,城市或其他任何东西,然后会找到一种SP,然后列出信息。 如何在SQL Sp或VS 2010中完成此操作?

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

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

但是,不要像其他人建议的那样直接将用户输入的数据放入LIKE子句中。 这导致了一个非常简单且非常危险的漏洞,称为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。

杰夫阿特伍德(SO成名)在这方面有一个简短的帖子 它是值得一读太:)

大多数人都遇到了部分解决方案 - 使用LIKE运算符。

但我认为问题的另一个方面可以在SQL中解决。

创建计算的varchar(MAX)列。 在此字段上启用全文索引。 然后你需要做的就是做一个像这样的SQL:

SELECT * from <TABLE_NAME> WHERE Keywords like '%<search term>%'

这样您就不必phone like <search>这样的phone like <search>name like <search>

使用LIKE运算符。

SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
City LIKE '%value%'

如果要使用一个可能包含许多不同类型数据的文本框 ,则需要在代码中具体说明要搜索的数据库表和列以及顺序。

例如,您可以编写一个执行此操作的查询:

  • 首先,在FirstName和LastName列的Customer表中搜索名称与文本框中的名称相似。 选择所有匹配项的CustomerID。
  • 接下来,在PhoneNumber列中的Customer表和Supplier表中搜索电话号码LIKE文本框中的电话号码。 为所有匹配选择CustomerID或SupplierID。 如果找到任何结果,请将它们与第一个查询的结果组合。
  • 继续搜索街道地址,并查询其他表格。
  • 随着时间的推移,将新记录添加到结果集中。
  • 查询了要搜索的所有表后,将得到一个包含ID的结果集。 您需要执行另一系列SELECT以获取要向用户显示的信息。 如果混合客户和供应商(以及员工等),这可能会变得非常复杂。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM