我想弄清楚如何提取比较数据。
为简单起见,下面是一些假数据。
12red34
56red78
90blue23
45blue67
89yellow10
我想要的是仅提取包含3个连续非定义项目的项目。
在这种情况下,它将拉除除89yellow10之外的所有项目,因为列表中的其他项目不包含与其匹配的3个字符。 90blue23和45blue67都包含"蓝色(或这些字母的某种组合)"与" red"相同项目。
这是在一个非常大的表上,使用contains子句手动搜索似乎不可行。
谢谢。
答案 0 :(得分:0)
这将使用样本数据执行,然而,Laughing Vergil具有完全有效的点数。
Declare @YourTable Table (ID int,SomeString varchar(50))
Insert Into @YourTable values
(1,'12red34'),
(2,'56red78'),
(3,'90blue23'),
(4,'45blue67'),
(5,'89yellow10')
Declare @MatchLen int = 3
;with cte as (
Select ID,B.*
From @YourTable A
Cross Apply (
Select N,S=substring(A.SomeString,N,@MatchLen)
From (Select Top (Len(A.SomeString)) N=Row_Number() Over (Order By Number) From master..spt_values) N
) B
Where substring(A.SomeString,N,3) like Replicate('[A-Z]',@MatchLen)
)
Select A.*
,MinS = min(S)
,MaxS = max(S)
From @YourTable A
Join (
Select S
From cte A
Group By S
Having Count(*)>=2
) B
On CharIndex(S,SomeString)>0
Group By ID,SomeString
Order By ID
返回
ID SomeString MinS MaxS
1 12red34 red red
2 56red78 red red
3 90blue23 blu lue
4 45blue67 blu lue