SQL查询通配符搜索

时间:2011-03-13 16:04:12

标签: c# sql sql-server tsql

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

正如其他几个人所建议的那样,使用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成名)对此有一个简短的posting。 值得一读this:)

答案 2 :(得分:1)

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

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

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

这样的SQL
SELECT * from <TABLE_NAME> WHERE Keywords like '%<search term>%'

这样您就不必执行phone like <search>name like <search>等。

答案 3 :(得分:0)

使用LIKE运算符。

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

答案 4 :(得分:0)

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

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

  • 首先,在Customer表中搜索 在FirstName和LastName列中 一个名字就像一个人 文本框。选择CustomerID 所有的比赛。
  • 接下来,搜索客户 表和供应商表,在 PhoneNumber列,用于手机 编号类似于文本框中的那个。 选择CustomerID或SupplierID 对于所有的比赛。如果找到任何结果,请将它们与第一个查询的结果合并。
  • 继续搜索街道 地址,并查询其他表格。
  • 将新记录添加到结果集中 你顺其自然。
  • 在查询了要搜索的所有表后,您将拥有一个包含ID的结果集。您需要执行另一系列SELECT以获取要向用户显示的信息。如果您将客户和供应商(以及员工等)混在一起,这可能会变得非常复杂。

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