有没有更好的方法来搜索SQL Server 2008中的任意文本,没有CLR或全文?

时间:2015-03-30 17:57:20

标签: sql sql-server sql-server-2008

使用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可能包含的内容没有限制。

2 个答案:

答案 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/