如何在sql server中混洗搜索数据

时间:2012-09-28 03:29:19

标签: sql-server

我的表名是列名。我输入例如ABC,这里的问题我不仅要搜索firstname = ABC,还要搜索CAB或CBA或BAC。

知道怎么做。

由于

2 个答案:

答案 0 :(得分:1)

首先创建一个获取字符串的函数(例如' ABC')并返回一个包含给定字符串的所有排列的表格(例如' ABC',' ACB' ' BAC'' BCA'' CAB'' CBA&#39)

我已经基于here中的java实现创建了这样一个函数:

CREATE FUNCTION [dbo].[permuteString] (@beginStr varchar(10),@endStr varchar(10))
RETURNS @result table (result varchar(10)) 
AS
BEGIN
     declare @i int
     declare @curStr varchar(10)
     if LEN(@endStr) <= 1
           insert into @result select @beginStr+@endStr
     else
           begin
                set @i = 1
                while(@i <= LEN(@endStr))
                begin
                  set @curStr = case when @i > 1 then substring(@endStr,1, @i-1) else '' end
                                + substring(@endStr, @i + 1, LEN(@endStr)-@i)        
                  insert into @result 
                  select * from dbo.permuteString(@beginStr + substring(@endStr,@i,1), @curStr)
                  set @i = @i+1
                end
           end  
    return 
END

现在,当您拥有此功能时,请在查询中使用in语句:

select columnName
from tableName
where columnName in (select * from dbo.permuteString('',@inputString))

您可以在此处查看更多排列功能的实现: The most elegant way to generate permutations in SQL server

答案 1 :(得分:0)

部分答案

似乎是一个有趣的问题需要解决。简单的部分是将'ABC'分成单个字符,然后创建笛卡尔积,将它们组合成独特的组合。困难的部分是创建动态SQL来处理笛卡尔积。

使用abcd更好地说明示例中的笛卡尔积产品部分。

declare @val varchar(10) = 'abcd'

-- split the string apart
declare @len int = datalength(@val), @i int = 1

select cast(null as int) as id, cast(null as char(1)) as c
into   #temp
where  1=2

while @i <= @len
begin
  insert into #temp
  values (@i, substring(@val, @i, 1))

  set @i = @i + 1
end

-- pull the combinations (need to make this into dynamic SQL)
select a.c + b.c + c.c + d.c as names
into   #combos
from   #temp a, #temp b, #temp c, #temp d
where  a.id <> b.id and a.id <> c.id and a.id <> d.id and
                        b.id <> c.id and b.id <> d.id and
                                         c.id <> d.id

-- check work
select * from #combos

-- use the combos to pull records where the first name matches...
-- select * from [table] where firstname in (select names from #combos)

drop table #temp, #combos

抱歉 - 没有时间弄清楚动态SQL。让它恰到好处将是棘手的。每个附加字符都会为dyn-SQL添加指数体积。

这并不能消除像'Suzanne'这样的重复字母。