如何在SQL中搜索带有可选特殊字符的匹配项?

时间:2009-05-14 09:45:07

标签: sql search apostrophe

我的搜索查询存在问题我使用的数据包含具有各种形式的撇号的名称和信息(HTML编码和实际)。 例如,我想要一个替代方案:

SELECT * FROM Customers WHERE REPLACE(LastName,'''','') 
LIKE Replace('O''Brien,'''','')

这只是一个例子,我想要的是一种方式,如果有人输入OBrien或O'Brien,这仍然可以工作,我需要替换三个版本的角色,数据是源代码,不能更改 - 什么可以对查询执行以允许此类搜索工作 我的项目名称以这种方式工作,目前有许多嵌套的REPLACE函数,似乎无法找到可以这种方式工作的东西,效率更高。
如果有帮助,我正在使用MS SQL 2000和ASP。


修改

这是需要匹配O'Brien或OBrien的查询,此查询执行此操作但效率太低 - 它由另一个项目名称和FirstName(可选)连接以进行匹配。

SELECT * FROM Customers
WHERE 
REPLACE(REPLACE(REPLACE(LastName,''',''),''',''),'''','') 
LIKE 
REPLACE(REPLACE(REPLACE('%O'Brien%',''',''),''',''),'''','')

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

SELECT * 
FROM Customers 
WHERE LastName LIKE Replace('O''Brien,'''','%')

允许它使用索引,因为您没有修改原始列。

答案 1 :(得分:1)

对于纯SQL,转义完全没必要。

SELECT * FROM Customers WHERE LastName = 'O''Brien'

答案 2 :(得分:1)

如果你想保持正确并在SQL中这样做,这可能是你能做的最好的

SELECT * FROM Customers WHERE 
LastName LIKE 'O%Brien' AND 
REPLACE(LastName,'''','') LIKE 'O''Brien'

由于选择性差,您有时仍会进行表扫描。

第一个原因是尝试使用现有索引。 第二场比赛的原因是为了确保像ObbBrien这样的姓氏不匹配。

当然,最好的办法是不需要丑陋的替换。这可以通过存储额外的干净姓氏列在应用程序中实现。或者在触发器中。或者在索引视图中。

答案 3 :(得分:0)

使用参数而不是在代码中构建查询。

如果您使用的是ADO,可以使用以下语法:

Dim cmd, rs, connect, intNumber
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = "your connectionstring"
cmd.CommandText = "SELECT * FROM Customers WHERE LastName LIKE @LastName"
cmd.Parameters.Append cmd.CreateParameter("@LastName",,,,"O'Brien")
Set rs = cmd.Execute 

这应执行查询并插入为数据库正确格式化的字符串O'Brien。

使用参数可确保所有值都已正确格式化,并且还可以保护您免受SQL注入攻击。