我的桌子上装满了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+%'
答案 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%'