搜索任意字符串,而不仅仅是T-SQL中的前缀

搜索任意字符串,而不仅仅是T-SQL中的前缀,sql,string,ssms,Sql,String,Ssms,我的要求是能够搜索列中的字符串,这些字符串根据传递的字符串的顺序匹配任意数量的字符 例如: 如果我通过了Hello,并且如果我的表列有Tell,则查询应选择Tell,以两个字符串匹配ll。 而它也可以给出单个字符匹配的结果,因为其中不能有顺序。 但是,如果它的两个字符匹配,那么这两个字符必须是连续的,不能从任何位置随机选择,例如在you和our中,它是两个字符匹配,因为ou以相同的顺序出现在两个字符串中。 到目前为止,我考虑的是在查询中使用子字符串,直到循环的长度,即 while begin(@

我的要求是能够搜索列中的字符串,这些字符串根据传递的字符串的顺序匹配任意数量的字符

例如:

如果我通过了
Hello
,并且如果我的表列有
Tell
,则查询应选择
Tell
,以两个字符串匹配
ll
。 而它也可以给出单个字符匹配的结果,因为其中不能有顺序。 但是,如果它的两个字符匹配,那么这两个字符必须是连续的,不能从任何位置随机选择,例如在
you
our
中,它是两个字符匹配,因为
ou
以相同的顺序出现在两个字符串中。 到目前为止,我考虑的是在查询中使用
子字符串
,直到循环的长度,即

while begin(@counter <= lengthOfPassedString)
   select Name from column where column LIKE + '%' + SUBSTRING(@parameterFromUser, 1, @counter) + '%' 
end

在开始时(@counter假设您需要至少匹配两个字符,下面是一个不需要循环的蛮力方法:

它只适用于长达9个字符的输入。我想你明白了

这是我能想到的唯一一个非循环解决方案。您可能可以为XML做一些疯狂的
事情,但我认为这太过分了

您也可以使用CTE或从系统表中选择来生成理货表,并将其像循环一样使用。如果您希望看到该解决方案,请告诉我

declare @p varchar(50)
SET @p = 'Krook'

select * from 
(
select 'Westbrook' G
UNION ALL
select 'Tell' G
UNION ALL
select 'Something' G
) F
where (
f.G LIKE REPLACE('%' + substring(@p,1,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,2,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,3,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,4,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,5,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,6,2) + '%','%%','')
OR
f.G LIKE REPLACE('%' + substring(@p,7,2) + '%','%%','')
)

因此,如果您使用param1='abc',任何包含字母
a
b
c
的单词都应该返回?或者它必须至少匹配两个:
ab
bc
?我们可以假设传入的字符串的最大长度吗?然后您可以使用很长的长度或每两个字符强制一次沿着输入参数的方向,不使用loop@Nick.McDermaid:它必须至少匹配一个或多个。是的,我们可以假设传入的字符串的最大长度。我理解蛮力技术,这就是我在问题中提到嵌套while循环时的意思。内部循环维护端点位置和oute的计数器r循环用于起始位置,但有更好的方法吗?实际上是一个或多个,因为我将计算匹配字符和未匹配字符的百分比,所以重要的是匹配了多少字符。如果它的两个字符匹配,那么这两个字符必须是连续的,而不是从任何位置随机选择,即在您和我们的,这是一个两个字符的匹配,因为ou以相同的顺序出现在两个字符串中。hmmm这确实有助于提前解释所有这些内容…我下面的解决方案在这种情况下没有任何用处。McDermaid:谢谢,但这正是嵌套while循环所能做的,即更改起始位置。我得到了这个子字符串方法,这里的性能会更好相同,即(长管柱)平方,但可能是一些内置函数或全文搜索,以任何可能的方式都可以做得比我完全不知道的更好?什么是XML方法?我对此一无所知。我想知道更多关于它是如何工作的。不同的是,这是一个子表/视图,可以连接到其他表,并可能通过quer进行优化y Optimizer。一个过程解决方案通常不能。哦,无法想象在多行TVF内部的select查询中帮助它。我对它不了解,所以有点不确定。FOR XML只是一种预感。例如,你可以使用它来透视数据,可能有一种方法也可以使用它来做你想做的事情。但我不能我还将建议一种基于集合的解决方案(即理货表),而不是程序解决方案(循环)