使用SQL Server 2008,不使用全文索引或CLR集成,有一种更好的方法来搜索表列中的任意文本,而不是以下内容:
declare @SubString nvarchar(max) = 'Desired substring may contain any special character such as %^_[]'
select * from Items where Name like '%' +
replace(
replace(
replace(
replace(
replace(
replace(
@SubString
,';',';;')
,'%',';%')
,'[',';[')
,']',';]')
,'^',';^')
,'_',';_')
+ '%' escape ';'
这有效,但似乎不必要地野蛮。鉴于上述限制,是否有更简单,更清晰或更有效的方法?
Name
列可能包含的内容,以及我们搜索的SubString可能包含的内容没有限制。
答案 0 :(得分:0)
我唯一能想到的是将replace(replace(replace...
变成用户定义的函数。然后,您可以将查询简化为:
SELECT * FROM Items WHERE Name LIKE CleanMyString(@Substring) escape ';'
它并不完全"更简单"。它不太可能更有效率。但它确实清理了语法并使其更清晰。
答案 1 :(得分:0)
(您可以使用charindex进行直接搜索,例如查找包含Ben的每个名字:
select * for customers where charindex('Ben', firstname) > 0
或者您可以使用patindex创建各种强大的模式搜索:
SELECT PATINDEX ('%[0-9].%[0-9].%[0-9].%','278.2.6.49');
返回第一个点之前的数字,如果字符串中没有三组数字,则返回0。
有关在TSQL中使用模式(非正则表达式)的非常好的介绍(从上面复制的示例),请参阅: https://www.simple-talk.com/sql/t-sql-programming/patindex-workbench/