sql select 2个字段几乎相等



想象一下这样一个表:

ID - NAME
1    BART
2    LISA
3    HOMER
4    MISA
5    HOMRE

我只想选择3个或3个以上字符等于和跟随的行。所以在这个选择之后,我应该得到:

ID - NAME
2    LISA
3    HOMER
4    MISA
5    HOMRE

如何使用sql server 2008做到这一点?

我假设你的意思是相同位置的相同字符

这不会特别快,但是。。。

;with cteLetters AS 
(  
   SELECT  
        ID, 
        #t.name,
        Number as Position,
        SUBSTRING(#t.name,Number,1) AS [Char]      
   FROM #t
        INNER JOIN master.dbo.spt_values 
        ON Number BETWEEN 1 AND LEN(#t.name) 
        AND type='P'      
)   
    select a1.name, a2.name
    from cteLetters a1
        inner join cteLetters a2 
            on a1.id<>a2.id
            and a1.position = a2.position -- omit this line if order doesn't matter
            and a1.char = a2.char
    group by a1.name,a2.name
    having COUNT(*)>=3

(我想象你的表被称为#t,有两个字段(id,name))

要测试任意位置的常见字符,可以使用SQL函数:

create function dbo.CommonChars(@str1 varchar(255), @str2 varchar(255))
returns int
begin
    declare @count int
    declare @cur int
    set @cur = 1
    set @count = 0
    while @cur <= LEN(@str1)
    begin
        if charindex(substring(@str1, @cur, 1), @str2) > 0
        begin
            set @count = @count + 1
        end
        set @cur = @cur + 1
    end
    return @count
end

测试数据:

create table #test (
  id int,
  name varchar(255)
);
insert into #test 
select 1, 'BART' union all
select 2, 'LISA' union all
select 3, 'HOMER' union all
select 4, 'MISA' union all
select 5, 'HOMRE'

测试声明:

select * from #test t1 where exists
    (select 1 from #test t2
        where t1.id != t2.id and
        dbo.CommonChars(t1.name, t2.name) >= 3)

退货:

id  name
2   LISA
3   HOMER
4   MISA
5   HOMRE

注意:如果其中一个字符串多次出现一个字符,则函数将无法按预期工作(例如,如果您有字符串"MUMMY"one_answers"MA",则上述查询将返回"MUMMY";它与"MA"有3个"共同"的Ms,因为如果其他字符串中包含每个M,则函数会分别检查每个M)。你必须从第二个字符串中删除匹配的字符来防止这种行为;我将把它留给感兴趣的读者练习。

最新更新