2

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

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

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


编辑

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

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

4 回答 4

1

你可以试试这个:

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

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

于 2009-05-14T09:48:34.553 回答
1

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

SELECT * FROM Customers WHERE LastName = 'O''Brien'
于 2009-05-14T09:56:03.803 回答
1

如果您想保持正确并在 SQL 中执行此操作,这可能是您能做的最好的

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

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

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

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

于 2009-05-14T09:59:28.490 回答
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 注入攻击。

于 2009-05-14T09:55:16.393 回答