如何仅选择至少包含这么多字符的项目

时间:2016-12-20 16:54:23

标签: sql sql-server

我想弄清楚如何提取比较数据。

为简单起见,下面是一些假数据。

12red34
56red78
90blue23
45blue67
89yellow10

我想要的是仅提取包含3个连续非定义项目的项目。

在这种情况下,它将拉除除89yellow10之外的所有项目,因为列表中的其他项目不包含与其匹配的3个字符。 90blue23和45blue67都包含"蓝色(或这些字母的某种组合)"与" red"相同项目。

这是在一个非常大的表上,使用contains子句手动搜索似乎不可行。

谢谢。

1 个答案:

答案 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