Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql选择2个几乎相等的字段_Sql_Sql Server_Select - Fatal编程技术网

sql选择2个几乎相等的字段

sql选择2个几乎相等的字段,sql,sql-server,select,Sql,Sql Server,Select,想象一下这样一张桌子: ID - NAME 1 BART 2 LISA 3 HOMER 4 MISA 5 HOMRE 我只想选择3个或更多字符相等且在后面的行。因此,在此选择之后,我应该得到: ID - NAME 2 LISA 3 HOMER 4 MISA 5 HOMRE 如何使用sql server 2008实现这一点?我假设您指的是相同位置的相同字符 这不会很快,但是 ;with cteLetters AS ( SELEC

想象一下这样一张桌子:

ID - NAME
1    BART
2    LISA
3    HOMER
4    MISA
5    HOMRE
我只想选择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
测试声明:

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和MA,则将通过上述查询返回MUMMY;它与MA有3毫秒的共同点,因为函数会分别检查每个M是否包含在任何其他字符串中。例如,您必须从第二个字符串中删除匹配的字符以防止此类行为;我将把它作为练习留给感兴趣的读者。

嗨,欢迎来到StackOverflow!你需要更清楚地定义你的意思。还有,你自己试过什么吗?我试着用类似的说法。但我认为它不能满足我的需要。我看不出哪种说法有用。我甚至不知道在sql中是否可以这样做。嗯,为什么这个问题实际上已经结束了?对我来说,这是非常清楚的要求。唯一可能有点欠缺的想法是迄今为止所做的尝试。。。所以我猜是投了反对票,但接近尾声,真的吗?我有我的答案,所以我真的不知道care@KevinRocher:对于你的下一个问题,你应该关心,但是-你很幸运,我在它结束之前回答了,因为结束的问题不能再回答了;这不完全是我想要的,但我想多亏了你,现在我可以得到了。你创建的“cteLetters”表正在相互测试。我试试看。它叫做公共表表达式,是一种重用结果集的方法,也是一种进行递归查询的方法。为什么要使用行数?您已经将master.dbo.spt_values.Number作为字符位置。@AndriyM Good point-早期迭代的剩余部分:当有三个或更多相同的名称时,如LISA、MISA、VISA,这将返回重复的名称,但我认为这是一个好的开始,+1。感谢使用此实现更容易
id  name
2   LISA
3   HOMER
4   MISA
5   HOMRE