我有四列包含名称,并希望LIKE
在 Microsoft SQL Server 环境中使用 a 来搜索这些列。
复杂之处在于名称可能包括左右单引号/斜撇号(即‘
和’
,char(145)
和char(146)
),它们应该与直撇号匹配(即'
, char(39)
)
执行以下操作非常慢:
SELECT person_id
FROM person
WHERE REPLACE(
REPLACE(
person_name,
CHAR(145),
CHAR(39)
),
CHAR(146),
CHAR(39)
) LIKE '{USER_INPUT}'
Run Code Online (Sandbox Code Playgroud)
正如Stack Overflow 上的SQL 替换语句太慢中所解释的那样,这是因为使用REPLACE
使语句不可修改。
有没有办法让 SQL Server 以更好的方式处理这种情况?
已经提出的一种解决方案是具有应用程序产生一个“搜索”值,它串接所有字段(的person_name
,person_surname
,person_nickname
等)并且将存在问题的字符在编辑点。这可以被有效地索引和搜索。与实施像 Lucene 这样的完整 NoSQL 解决方案相比,将这些数据存储在单独的 SQL 表/列中需要更少的应用程序重写。
上面的例子是一个简化:查询并没有像我上面解释的那样从字面上构建,我们确实实现了 SQL 注入(和其他)保护。
问题是如何将表数据中的斜撇号替换为直撇号。澄清:
O‘Malley
- 这应该匹配两者O‘Malley
或O'Malley
O'Malley
- 这应该匹配两者O‘Malley …