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