在一般情况下,我有一个使用全文索引执行搜索的存储过程。但是我不能为一个字段建立全文索引,我需要使用LIKE构造。
所以,问题是:参数可能是
“a*”或“b*”
像CONTAINS
命令的参数。
Сan任何人都给出了一个很好的解决方案,如何转换这个参数进行LIKE
构造。
谢谢你。
PS:我用MSSQL Server
在一般情况下,我有一个使用全文索引执行搜索的存储过程。但是我不能为一个字段建立全文索引,我需要使用LIKE构造。
所以,问题是:参数可能是
“a*”或“b*”
像CONTAINS
命令的参数。
Сan任何人都给出了一个很好的解决方案,如何转换这个参数进行LIKE
构造。
谢谢你。
PS:我用MSSQL Server
根据您想要支持的全文搜索结构,这通常是不可能的。
根据MSDN,SQL Server 上的全文搜索语法支持以下结构:
一个或多个特定单词或短语(简单术语)
LIKE '%[,;.-()!? ]学期[,;。-()!?]%'
词以指定文本开头的词或短语(前缀词)
LIKE '%[,;.-()!? ]学期%'
特定词的屈折形式(世代词)
不可能
与另一个词或词组相近的词或词组(邻近词)
不可能
特定词的同义词形式(同义词库)
不可能
使用加权值的单词或短语(加权项)
不可能
我标记为“不可能”的那些不能真正翻译成 LIKE 查询,但当然你可以发挥创造力(使用你自己的词干算法来处理屈折形式,或者你自己的同义词词典)来支持至少其中一些.
最后,您可能需要使用动态 SQL。
给定输入,这是一种获得正确 WHERE 子句的方法:
declare @str varchar(255) = '"a*" or "b*"';
with const as (select 'col' as col)
select col+' like '+replace(replace(REPLACE(@str, '"', ''''), '*', '%'), 'or ', 'or '+COL+' like ') as WhereClause
from const
“const”只是一个包含一列的表,用于指定您的列名。它允许在一个地方指定它。
这只是替换以获得 LIKE 的正确语法。当然,要支持来自 CONTAINS 的更多功能,这将更加复杂。
谢谢大家!
不幸的是,表达式解析对于一般情况来说是不够的。
我在 MS SQL SERVER 中使用正则表达式
http://anastasiosyal.com/POST/2008/07/05/REGULAR-EXPRESSIONS-IN-MS-SQL-SERVER-USING-CLR.ASPX