SQL检测相同字符的序列?

时间:2016-11-18 11:29:47

标签: sql select sql-server-2008-r2 where

我的桌子上装满了ID为字符的物品。

示例

"TGHZN"
"FVGHR"
"OLTVD"
"EERFV" -- invalid because of EE (sequence of the same character)
"EFEDC"
"DFFFB" -- invalid because of FFF

如何选择包含无效ID的所有行?

无效ID由ID内的相等字符序列(例如AA)定义。

我使用RegEx尝试了一下但没有成功:SELECT * FROM Items WHERE ID LIKE '%(.)\1+%'

3 个答案:

答案 0 :(得分:1)

这对SQL Server来说并不容易,因为SQL Server不支持正则表达式(称为' LIKE'"""正常表达式"是严重的营销超额预算)的温和增强。

假设你的id长度为5,你可以尝试这样的事情:

where (id like '%' + substring(id, 1, 1) + substring(id, 1, 1) + '%') or
      (id like '%' + substring(id, 2, 1) + substring(id, 2, 1) + '%') or
      (id like '%' + substring(id, 3, 1) + substring(id, 3, 1) + '%') or
      (id like '%' + substring(id, 4, 1) + substring(id, 4, 1) + '%')

SQL Server没有(开箱即用)支持正则表达式。

实际上,replicate()函数会使逻辑更清晰:

where (id like '%' + replicate(substring(id, 1, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 2, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 3, 1), 2) + '%') or
      (id like '%' + replicate(substring(id, 4, 1), 2) + '%')

答案 1 :(得分:1)

另一种选择(ID的长度没有限制)

Select Distinct A.ID 
From   YourTable A
Join  (Select Top 26 Patt=Replicate(Char(64+Row_Number() Over (Order By Number)),2) From master..spt_values ) B
  on   CharIndex(B.Patt,A.ID)>0

答案 2 :(得分:-1)

从您编写的表达式中删除“+”。以下应该有效:

SELECT * FROM Items WHERE ID LIKE '%(.)\1%'