2016-11-18 97 views
-1

我有一张桌子,里面填充了具有字符ID的项目。SQL检测相同字符的序列?

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

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

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

我用正则表达式尝试过没有成功:SELECT * FROM Items WHERE ID LIKE '%(.)\1+%'

回答

1

这是不容易的与SQL Server这样做,因为SQL Server不支持正则表达式(调用温和增强“喜欢”“正则表达式”是严重的市场推广)。

假设你的IDS有长度为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) + '%') 
+0

确定与480k代表我认为这是“的”解决方案......但为什么我的RegEx接近不可能?我认为它应该以某种方式工作 – Toshi

+0

@GodofSource SQL Server只支持最小的正则表达式。你不能使用它的全部功能。基本上像[0-9]这样的东西,使用%作为通配符,使用^作为否定或启动,以及其他一些事情,但是您不打算用其他语言中的正则表达式解决复杂问题。 https://msdn.microsoft.com/en-us/library/ms174214.aspx – scsimon

+1

@GodofSource。 。 。哦,那很简单。 SQL Server不支持正则表达式。 –

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 
+0

该版本假定这些字符是ASCII大写字母。如果包含任何字母,它会变得更加麻烦。 。 。包括国家字符集。 –

+0

@GordonLinoff你是对的,我没有考虑国家字符集,但关于大写字母,只有当你的排序规则设置为CS。一个简单的解决方法是将TOP 26改为TOP 255,并删除64 + –

-1

从表达式删除 '+'你写。以下应该工作:

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

使用SQL Server中不存在的语法,而不是进行最小限度的测试,例如, 'select 1 where'AAAAA'LIKE'%(。)\ 1%' –

+0

'SELECT CASE WHEN'FOO'LIKE'%(。)\ 1%'THEN 1 ELSE 0 END AS ID' returns'0' – Toshi